防止sql注入的最好方式


  1. 避免 SQL injection 攻擊的傳統方法之一是,把它作為一個輸入合法性檢查的問題來處理,只接受列在白名單中的字符,或者識別並避免那些列在黑名單中的惡意數據。白名單方法是一種非常有效方法,它可以強制執行嚴格的輸入檢查規則,但是參數化的 SQL 指令所需維護更少,而且能提供更好的安全保障。而對於通常采用的列黑名單方式,由於總是存在一些小漏洞,所以並不能有效地防止 SQL injection 威脅。例如,攻擊者可以:
  2. — 把沒有被黑名單引用的值作為目標
  3. — 尋找方法以繞過對某一轉義序列元字符的需要
  4. — 使用存儲過程來隱藏注入的元字符
  5. 上述所提到的1,2,3,4,5,白黑名單的方式則是來自於下面的文章Foritfy --Detail --Sql注入中的相關解釋;
 
除了上述所提到的白黑名單的方式以外,在Sql注入中Java的最好實現方式則是,通過使用預編譯的手段來實現,JDBC的實現則是使用PreparedStatement .setString(0,"")等的方式實現預編譯,sql中則使用 ? 作為占位符而存在,
Hibernate中則也是通過書寫hql,采用占位符的方式,再進行setParameter的方式進行參數封裝即可,目前在產品中出現的一些問題則是,老的代碼中存在過多的 sql 或 hql 使用 ++等方式拼接而成的執行語句,導致Fortify安全測試掃描時,出現過多的sql注入問題,
那么除此之外,為什么使用SetParameter等預編譯的形式,可以阻斷sql注入等的情況的發生呢,我們是否也可以模擬一個sql預編譯前的代碼效果,在執行sql前,先進行一下過濾呢?(似乎有點是類似於白黑名單的方式),但此處更想表明的是setParameter所做的那些操作,避免了sql注入的問題,下面簡單的貼一些jdbc中setString時所做的一些操作,並不是所想象中的,直接按照位置,和形參中所得到的sql,進行一下簡單的替換而已噢,在jdbc中set賦值時,還是相對交於復雜的,
(注:mybatis中,在進行傳參時,就是直接使用的 ?的形式進行占位賦值,所以基本上現有的常用orm框架mybatis以及hibernate,包括jdbc都已經解決了sql注入的問題,只要使用得當一般是都沒什么問題的)。
jdbc中setString時的部分源碼截圖:
如上所展示的3個截圖,其實也只是setString時的 2/3 的代碼,所以可以看到,在sql防注入的方式上,jdbc的PreparedStatement類中所做的處理操作還是很多的,
在直接setObject的時候:
PreparedStatement的操作則是使用 instanceof 判斷 所要占位符賦值的類型,然后再調用相關的setInteger(),setString等方法進行賦值;
參考鏈接中有個知乎鏈接,還是很不錯的,推薦可看;
 
可參考:
 


免責聲明!

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



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