一、什么是sql注入
利用程序員的代碼bug,將輸入的參數繞過校驗並在系統中當做代碼運行,從而攻擊系統。
二、如何避免sql注入
1.對sql語句進行預編譯
PreparedStatement類可以對sql語句進行預編譯,那么傳入的參數只會被當做參數而不會被當做代碼去運行。
2.存儲過程
存儲過程是被編譯后存儲在數據庫中的,所以它不會有sql注入的隱患。
3.mybatis框架可避免sql注入
mybatis進行參數傳遞的占位符有兩種#{}和${},#{}在進行參數傳遞時會先進行sql編譯然后再替換參數,所以不會有sql注入的問題,${}進行參數傳遞時會先拼接sql然后進行sql編譯,會有安全隱患。因此非特殊情況,盡量使用#{}進行參數傳遞。
4.mybatis中like的安全風險
select * from test clomn like '%${filed}%'. 該sql語句有注入風險,改為select * from test clomn like concat('%',#{filed},'%')。
5.入參的安全校驗
前后端可對輸入的參數進行特殊字符過濾,避免別有用心的參數進入。