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();
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();