分享一個大牛的人工智能教程,零基礎!通俗易懂!風趣幽默!希望你也加入到人工智能的隊伍中來!請輕擊http://www.captainbed.net
1、簡單又有效的方法是使用PreparedStatement
采用預編譯陳述句集,它內置了處理SQL注入的能力,只要使用它的setXXX(如:setString)方法傳值即可,
好處:
(1).代碼的可讀性和可維護性變好,
(2).PreparedStatement盡最大可能提高性能,
(3).最重要的一點是極大地提高了安全性,
原理:
SQL注入只對SQL陳述句的編譯程序有破壞作用,而PreparedStatement的SQL陳述句編譯階段已經準備好了,執行階段只是把輸入串作為資料處理,而不再對SQL陳述句進行決議、準備,因此也就避免了SQL注入問題,
一些熱門ORM框架在處理SQL時候也都使用了PreparedStatement,比如MyBatis,
我們在使用MyBatis要注意:在注入引數值得時候使用#{xxx},#{xxx}已經啟用了預編譯功能,在SQL執行前,會先將上面的SQL發送給資料庫進行編譯;執行時,直接使用編譯好的SQL,替換占位符“?”就可以了,因為SQL注入只能對編譯程序起作用,所以這樣的方式就很好地避免了SQL注入的問題,
“${xxx}”這樣格式的引數會直接參與SQL編譯,從而不能避免注入攻擊,
有時有些操作要使用這種方式,比如傳入表,模糊匹配等,這時可以使用bind+#{}防止SQL注入(#{}進行預編譯,傳遞的引數不進行編譯,只作為引數,相當于PreparedStatement),
bind元素可以從OGNL運算式中創建一個變數并將其系結到背景關系,比如:
<select id="selectBlog" resultType="Blog">
<bind name="pattern" value="'%' + _parameter.getTitle() + '%'" />
SELECT * FROM BLOG WHERE title LIKE #{pattern}
</select>
2、使用過濾器
如果我們做不到所有的SQL陳述句都使用PreparedStatement,我們可以使用過濾器,進行全域的攔截這些字串,在過濾器中,使用正則運算式過濾傳入的引數,使用正則運算式,判斷是否匹配:
String begin="您的請求引數資訊";
//可以通過組態檔,去配置這些特殊字符,以便隨時添加一些關鍵字,
String pattern="|and|exec|execute|insert|select|delete|update|count|drop|*|%|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|;|or|-|+|,|like";
Pattern r = Pattern.compile(pattern);
Matcher isMatch = r.matcher(begin);
if(isMatch.find()){
//危險請求引數
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/401729.html
標籤:其他
