首頁>Club>
13
回覆列表
  • 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();

  • 中秋節和大豐收的關聯?
  • 女司機上線,想買帝豪GS,用過的能分享下評價嗎?