sql注入防御的方法有:1、PreparedStatement;2、使用正則表達式過濾傳入的參數;3、字符串過濾。其中,采用預編譯語句集是簡單又有效的方法,因為它內置了處理SQL注入的能力。
sql注入防御的方法
下面針對JSP,說一下應對方法:
(推薦學習:mysql教程)
1、(簡單又有效的方法)PreparedStatement
采用預編譯語句集,它內置了處理SQL注入的能力,只要使用它的setXXX方法傳值即可。
使用好處:
(1)代碼的可讀性和可維護性;
(2)PreparedStatement盡最大可能提高性能;
(3)最重要的一點是極大地提高了安全性。
原理:
sql注入只對sql語句的準備(編譯)過程有破壞作用,而PreparedStatement已經準備好了,執行階段只是把輸入串作為數據處理,而不再對sql語句進行解析、準備,因此也就避免了sql注入問題。
2、使用正則表達式過濾傳入的參數
要引入的包:
import?java.util.regex.*;
正則表達式:
private?String?CHECKSQL?=?“^(.+)sands(.+)|(.+)sor(.+)s$”;
判斷是否匹配:
Pattern.matches(CHECKSQL,targerStr);
下面是具體的正則表達式:
檢測SQL meta-characters的正則表達式 :
/(%27)|(’)|(--)|(%23)|(#)/ix
修正檢測SQL meta-characters的正則表達式 :
/((%3D)|(=))[^ ]*((%27)|(’)|(--)|(%3B)|(:))/i
典型的SQL 注入攻擊的正則表達式 :
/w*((%27)|(’))((%6F)|o|(%4F))((%72)|r|(%52))/ix
檢測SQL注入,UNION查詢關鍵字的正則表達式 :
/((%27)|(’))union/ix(%27)|(’)
檢測MS SQL Server SQL注入攻擊的正則表達式:
/exec(s|+)+(s|x)pw+/ix
等等…..
3、字符串過濾
比較通用的一個方法:(||之間的參數可以根據自己程序的需要添加)
public?static?boolean?sql_inj(String?str){ String?inj_str?=?"'|and|exec|insert|select|delete|update| count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,"; String?inj_stra[]?=?split(inj_str,"|"); for?(int?i=0?;?i?=0){ return?true; } } return?false; }
凡涉及到執行的SQL中有變量時,用JDBC(或者其他數據持久層)提供的如:PreparedStatement就可以 ,切記不要用拼接字符串的方法就可以了。