mybaits的模糊查询_mybatis模糊查询防止SQL注入(很详细)
SQL注入,大家都不陌生,是一種常見的攻擊方式。攻擊者在界面的表單信息或URL上輸入一些奇怪的SQL片段(例如“or ‘1’=’1’”這樣的語句),有可能入侵參數(shù)檢驗(yàn)不足的應(yīng)用程序。所以,在我們的應(yīng)用中需要做一些工作,來防備這樣的攻擊方式。在一些安全性要求很高的應(yīng)用中(比如銀行軟件),經(jīng)常使用將SQL語句全部替換為存儲過程這樣的方式,來防止SQL注入。這當(dāng)然是一種很安全的方式,但我們平時(shí)開發(fā)中,可能不需要這種死板的方式。
1.${}模糊查詢存在SQL注入的例子:(${}未編譯,只是對其進(jìn)行拼接,相當(dāng)于Statement)
SQL:
Java測試:
本來是模糊查詢名字,結(jié)果對描述添加了過濾。
Preparing: SELECT * FROM haulinfo WHERE bigname like %% and bigdescription like 陽城% and bigStatus = ?
Parameters: 未開始(String)
Total: 2
2. bind + #{} 模糊查詢 防止SQL注入 (#{}進(jìn)行預(yù)編譯,傳遞的參數(shù)不進(jìn)行編譯,只作為參數(shù),相當(dāng)于PreparedStatement)
bind 元素可以從 OGNL 表達(dá)式中創(chuàng)建一個(gè)變量并將其綁定到上下文。比如:
SQL:
Java測試:
Preparing: SELECT * FROM haulinfo WHERE bigname like ? and bigStatus = ?
Parameters: %% and bigdescription like 陽城%(String), 未開始(String)
Total: 0
3.另一種模糊查詢方法select departmentid,updepartmentid,departmentname from
department where departmentid like concat(#{departmentid},%)
【結(jié)論】在編寫MyBatis的映射語句時(shí),盡量采用“#{xxx}”這樣的格式。若不得不使用“${xxx}”這樣的參數(shù),要手工地做好過濾工作,來防止SQL注入攻擊。
#{}:相當(dāng)于JDBC中的PreparedStatement
${}:是輸出變量的值
簡單說,#{}是經(jīng)過預(yù)編譯的,是安全的;${}是未經(jīng)過預(yù)編譯的,僅僅是取變量的值,是非安全的,存在SQL注入。
如果我們order by語句后用了${},那么不做任何處理的時(shí)候是存在SQL注入危險(xiǎn)的。你說怎么防止,那我只能悲慘的告訴你,你得手動處理過濾一下輸入的內(nèi)容。如判斷一下輸入的參數(shù)的長度是否正常(注入語句一般很長),更精確的過濾則可以查詢一下輸入的參數(shù)是否在預(yù)期的參數(shù)集合中。
總結(jié)
以上是生活随笔為你收集整理的mybaits的模糊查询_mybatis模糊查询防止SQL注入(很详细)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 源计划皮肤是谁画的呢?
- 下一篇: linux 启动脚本sleep后不执行_