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