首頁>Club>
11
回覆列表
  • 1 # 愛健身的北極熊

    java防SQL注入,最簡單的辦法是杜絕SQL拼接,SQL注入攻擊能得逞是因為在原有SQL語句中加入了新的邏輯,如果使用PreparedStatement來代替Statement來執行SQL語句,其後只是輸入引數,SQL注入攻擊手段將無效,這是因為PreparedStatement不允許在不同的插入時間改變查詢的邏輯結構 ,大部分的SQL注入已經擋住了, 在WEB層我們可以過濾使用者的輸入來防止SQL注入比如用Filter來過濾全域性的表單引數 。下面就舉三個例子來說明一下:

    第一種:

    採用預編譯語句集,它內建了處理SQL注入的能力,只要使用它的setString方法傳值即可,如下所示:

    String sql= "select * from users where username=? and password=?;PreparedStatement preState = conn.prepareStatement(sql);preState.setString(1, userName);preState.setString(2, password);ResultSet rs = preState.executeQuery();...

    第二種:

    採用正則表示式將包含有 單引號("),分號(;) 和 註釋符號(--)的語句給替換掉來防止SQL注入,如下所示:

    public static String TransactSQLInjection(String str)

    {

    return str.replaceAll(".*([";]+|(--)+).*", " ");

    }

    userName=TransactSQLInjection(userName);

    password=TransactSQLInjection(password);

    String sql="select * from users where username=""+userName+"" and password=""+password+"" "

    Statement sta = conn.createStatement();

    ResultSet rs = sta.executeQuery(sql);

    第三種:

    使用Hibernate框架的SQL注入防範 Hibernate是目前使用最多的ORM框架,在Java Web開發中,很多時候不直接使用JDBC,而使用Hibernate來提高開發效率。

    在Hibernate中,仍然不應該透過拼接HQL的方式,而應使用引數化的方式來防範SQL注入。有兩種方式,一種仍然是使用JDBC一樣的佔位符“?”,但更好的方式是使用Hibernate的命名引數,例如檢測使用者名稱和密碼是否正確,使用Hibernate可以寫成如下:

    String queryStr = “from user where username=:username ”+”password=:password”;

    List result = session.createQuery(queryStr).setString("username", username).setString("password", password).list();

  • 2 # 不羈的大叔w傑

    方法/步驟

    1/4

    java防SQL注入,最簡單的辦法是杜絕SQL拼接,SQL注入攻擊能得逞是因為在原有SQL語句中加入了新的邏輯,如果使用PreparedStatement來代替Statement來執行SQL語句,其後只是輸入引數,SQL注入攻擊手段將無效,這是因為PreparedStatement不允許在不同的插入時間改變查詢的邏輯結構 ,大部分的SQL注入已經擋住了, 在WEB層我們可以過濾使用者的輸入來防止SQL注入比如用Filter來過濾全域性的表單引數 。下面就舉三個例子來說明一下:

    2/4

    第一種:

    採用預編譯語句集,它內建了處理SQL注入的能力,只要使用它的setString方法傳值即可,如下所示:

    String sql= "select * from users where username=? and password=?;PreparedStatement preState = conn.prepareStatement(sql);preState.setString(1, userName);preState.setString(2, password);ResultSet rs = preState.executeQuery();...

    3/4

    第二種:

    採用正則表示式將包含有 單引號("),分號(;) 和 註釋符號(--)的語句給替換掉來防止SQL注入,如下所示:

    public static String TransactSQLInjection(String str)

    {

          return str.replaceAll(".*([";]+|(--)+).*", " ");

    }

    userName=TransactSQLInjection(userName);

    password=TransactSQLInjection(password);

    String sql="select * from users where username=""+userName+"" and password=""+password+"" "

    Statement sta = conn.createStatement();

    ResultSet rs = sta.executeQuery(sql);

    4/4

    第三種:

    使用Hibernate框架的SQL注入防範 Hibernate是目前使用最多的ORM框架,在Java Web開發中,很多時候不直接使用JDBC,而使用Hibernate來提高開發效率。

    在Hibernate中,仍然不應該透過拼接HQL的方式,而應使用引數化的方式來防範SQL注入。有兩種方式,一種仍然是使用JDBC一樣的佔位符“?”,但更好的方式是使用Hibernate的命名引數,例如檢測使用者名稱和密碼是否正確,使用Hibernate可以寫成如下:

    String queryStr = “from user where username=:username ”+”password=:password”;

    List result = session.createQuery(queryStr).setString("username", username).setString("password", password).list();

  • 3 # IT資訊i

    java防SQL注入,最簡單的辦法是杜絕SQL拼接,SQL注入攻擊能得逞是因為在原有SQL語句中加入了新的邏輯,如果使用PreparedStatement來代替Statement來執行SQL語句,其後只是輸入引數,SQL注入攻擊手段將無效,這是因為PreparedStatement不允許在不同的插入時間改變查詢的邏輯結構 ,大部分的SQL注入已經擋住了, 在WEB層我們可以過濾使用者的輸入來防止SQL注入比如用Filter來過濾全域性的表單引數

    01 import java.io.IOException;

    02 import java.util.Iterator;

    03 import javax.servlet.Filter;

    04 import javax.servlet.FilterChain;

    05 import javax.servlet.FilterConfig;

    06 import javax.servlet.ServletException;

    07 import javax.servlet.ServletRequest;

    08 import javax.servlet.ServletResponse;

    09 import javax.servlet.http.HttpServletRequest;

    10 import javax.servlet.http.HttpServletResponse;

    11 /**

    12 * 透過Filter過濾器來防SQL注入攻擊

    13 *

    14 */

    15 public class SQLFilter implements Filter {

    16 private String inj_str = ""|and|exec|insert|select|delete|update|count|*|%

    |chr|mid|master|truncate|char|declare|;|or|-|+|,";

    17 protected FilterConfig filterConfig = null;

    18 /**

    19 * Should a character encoding specified by the client be ignored?

    20 */

    21 protected boolean ignore = true;

    22 public void init(FilterConfig config) throws ServletException {

    23 this.filterConfig = config;

    24 this.inj_str = filterConfig.getInitParameter("keywords");

    25 }

    26 public void doFilter(ServletRequest request, ServletResponse response,

    27 FilterChain chain) throws IOException, ServletException {

    28 HttpServletRequest req = (HttpServletRequest)request;

    29 HttpServletResponse res = (HttpServletResponse)response;

    30 Iterator values = req.getParameterMap().values().iterator();//獲取所有的表單引數

    31 while(values.hasNext()){

    32 String[] value = (String[])values.next();

    33 for(int i = 0;i < value.length;i++){

    34 if(sql_inj(value[i])){

    35 //TODO這裡發現sql注入程式碼的業務邏輯程式碼

    36 return;

    37 }

    38 }

    39 }

    40 chain.doFilter(request, response);

    41 }

    42 public boolean sql_inj(String str)

    43 {

    44 String[] inj_stra=inj_str.split("\\|");

    45 for (int i=0 ; i < inj_stra.length ; i++ )

    46 {

    47 if (str.indexOf(" "+inj_stra[i]+" ")>=0)

    48 {

    學習資源

    百度搜索圈T社群(www.aiquanti.com) 免費影片教程

  • 中秋節和大豐收的關聯?
  • 清朝當時的大炮編隊是非常強的,為何後面的戰爭還是用冷兵器?