什么是SQL注入以及mybatis中#{}為什么能防止SQL注入而${}為什么不能防止SQL注入


 


1.什么是SQL注入

答:SQL注入是通過把SQL命令插入到web表單提交或通過頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL指令。

  注入攻擊的本質是把用戶輸入的數據當做代碼執行。

  舉例如: 表單有兩個用戶需要填寫的表單數據,用戶名和密碼,如果用戶輸入admin(用戶名),111(密碼),若數據庫中存在此用戶則登錄成功。SQL大概是這樣

      SELECT * FROM XXX WHERE userName = admin and password = 111

     但若是遭到了SQL注入,輸入的數據變為  admin or 1 =1 # 密碼隨便輸入,這時候就直接登錄了,SQL大概是這樣

      SELECT * FROM XXX WHERE userName = admin or 1 = 1 # and password = 111 ,因為 # 在sql語句中是注釋,將后面密碼的驗證去掉了,而前面的條件中1 = 1始終成立,所以不管密碼正確與否,都能登錄成功。

2.mybatis中的#{} 為什么能防止sql注入,${}不能防止sql注入

答: #{}在mybatis中的底層是運用了PreparedStatement 預編譯,傳入的參數會以 ? 形式顯示,因為sql的輸入只有在sql編譯的時候起作用,當sql預編譯完后,傳入的參數就僅僅是參數,不會參與sql語句的生成,而${}則沒有使用預編譯,傳入的參數直接和sql進行拼接,由此會產生sql注入的漏洞。

3.SQL語句中where 1=0是什么意思

表示條件永抄遠不成立
適用於導出表結構
比如說你想bai看下一個表的結構 你可以
select * from 表名 where 1=0


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM