MyBatis防止SQL注入的方法
MyBatis防止SQL注入的方法
文章目錄
- MyBatis防止SQL注入的方法
- 1. 前言
- 2. 示例
- 3. 不用MyBatis防止SQL注入的方法
- 4. 原理
- 5. 參考鏈接
1. 前言
????這個問題其實就是問MyBatis中的#{}和KaTeX parse error: Expected 'EOF', got '#' at position 19: …號的區別,在MyBatis中,#?{}是預編譯處理, {}是字符串替換。MyBatis在處理#{}時,會將sql中的#{}替換為?號,調用PreparedStatement的set方法來賦值;MyBatis在處理 $ { } 時,就是把 ${ } 替換成變量的值。使用 #{} 可以有效的防止SQL注入,提高系統安全性。
2. 示例
${param}傳遞的參數會被當成sql語句中的一部分,比如傳遞表名,字段名例子:(傳入值為id)order by ${param} 則解析成的sql為:order by id#{parm}傳入的數據都當成一個字符串,會對自動傳入的數據加一個雙引號例子:(傳入值為id)select * from table where name = #{param}則解析成的sql為:select * from table where name = "id"為了安全,能用#的地方就用#方式傳參,這樣可以有效的防止sql注入攻擊sql注入簡介 直接上了百度的例子,感覺一看就清晰明了某個網站的登錄驗證的SQL查詢代碼為:strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"惡意填入userName = "1' OR '1'='1";與passWord = "1' OR '1'='1";時,將導致原本的SQL字符串被填為strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"也就是實際上運行的SQL命令會變成下面這樣的strSQL = "SELECT * FROM users;"這樣在后臺帳號驗證的時候巧妙地繞過了檢驗,達到無賬號密碼,亦可登錄網站。所以SQL注入攻擊被俗稱為黑客的填空游戲。3. 不用MyBatis防止SQL注入的方法
????使用JDBC中的******PreparedStatement******,采用預編譯語句集,它內置了處理SQL注入的能力,只要使用它的set方法傳值即可。
????使用好處:
4. 原理
????MyBatis防止SQL注入的原理:MyBatis在處理#{}時,會將sql中的#{}替換為?號,調用PreparedStatement的set方法來賦值 ,PreparedStatement在執行階段只是把輸入串作為數據處理,不再對sql語句進行解析,準備,因此也就避免了sql注入問題。
????PreparedStatement防止SQL注入的原理:JDBC的PreparedStatement會將帶’?'占位符的sql語句預先編譯好,也就是SQL引擎會預先進行語法分析,產生語法樹,生成執行計劃。對于占位符輸入的參數,無論是什么,都不會影響該SQL語句的語法結構了,因為語法分析已經完成了,即使你后面輸入了這些sql命令,也不會被當成sql命令來執行了,只會被當做字符串字面值參數。所以的sql語句預編譯可以防御SQL注入。而且在多次執行同一個SQL時,能夠提高效率。原因是SQL已編譯好,再次執行時無需再編譯。
5. 參考鏈接
https://blog.csdn.net/qian_qian_123/article/details/92844194
https://www.cnblogs.com/pressur/p/11226392.html
https://blog.csdn.net/weixin_39986856/article/details/83651847
2022年1月6日 陰
總結
以上是生活随笔為你收集整理的MyBatis防止SQL注入的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Delphi iOS 开启文件共享 UI
- 下一篇: 安卓微软雅黑字体ttf_618巨献丨精致