之前看到的一道java面試題,Statement與PreparedStatement的區別,什么是SQL注入,如何防止SQL注入
前面部分比較好回答
1、PreparedStatement支持動態設置參數,Statement不支持。
2、PreparedStatement可避免如類似單引號的編碼麻煩。
3、PreparedStatement支持預編譯,Statement不支持。
4、在sql語句出錯時PreparedStatement不易檢查,而Statement則更便於查錯。
(如果有不完善歡迎補充)
而什么是sql注入?
sql注入是攻擊者通過sql注入漏洞繞過應用程序安全措施,檢索整個sql數據庫內容,甚至進行插入刪除修改操作。簡而言之,就是攻擊者用拼接sql語句可以直接對sql進行增刪改查。
比如select * from table where name = "+appName+",利用appName參數值的輸入,來生成惡意的sql語句,如將['or'1'='1'] 傳入可在數據庫中執行。
sql注入攻擊類型有很多。主要有帶內注入,帶外注入,盲注入。
如何防止sql注入?
1.盡量少使用或者不使用動態sql,這樣可以減少用戶提供的sql直接放入語句。
2.對數據庫一些敏感內容進行加密存儲,比如密碼,電話等。
3.限制數據庫權限。
4.不要直接向用戶顯示數據庫錯誤,因為攻擊者可以通過錯誤信息獲取一定的有用信息。
5.對訪問數據庫的Web應用程序使用Web應用程序防火牆(WAF),這個比較直接,防火牆通過設置,進行判斷,如果是sql注入,直接給你攔外邊了,不會繼續提交請求。
6.更新數據庫,減少漏洞