在企業中有以下幾種方式能夠選擇;php
沒有作任何過濾,直接把參數插入到SQL語句中,就是注入點;前端
PHP Demo:mysql
// 接收來自前端輸入參數id $uid = $_GET['id']; // 構造查詢SQL語句,注意這裏,uid參數沒作過濾就放到SQL語句中進行拼接 $sql = "select * from user where user_id = $uid"; // 語句也未使用預編譯,就執行查詢動做,SQL注入就是這麼產生的 query($sql);
注意,上面只是一個演示案例,如今的Web框架基本是MVC模式的,Model層通常不接收前端的參數,接收前端參數通常在Control層完成,也就意味着查詢SQL注入的時候你須要跟蹤一個前端參數從Control層傳遞到Model。這期間,一個前端參數可能會通過十幾個函數的調用傳遞都是有可能的。這個時候考驗你的就不是技術了,而是耐心。sql
最開始使用的是Seay源代碼審計工具,後面使用的是Rips代碼審計工具,發現都不能知足本身的需求,由於有個致命缺陷,就是會有遺漏的SQL注入找不全。這樣就很是危險了,你說XSS、CSRF這種攻擊客戶端的洞,漏幾個就漏幾個了。但SQL注入這種攻擊服務端的漏了幾個,若是漏的那幾個還被外部發現了,那飯碗還要不要了?框架
比較的結果是 Rips 比 Seay 誤報率、準確率要高好幾個檔次。使用Risp能提升審覈的效率,可是並不能提升精度,因此正確用法的是,拿到陌生的代碼時,可使用Rips先掃一遍,先找出一些容易找到SQL注入點。想要覆蓋全,而且有精度的效果,往下看。函數
Taint這種參數污染標記跟蹤的工具又會比Rips的準確率高。工具
精度和效率感受是個矛盾;ui
Taint總會有誤報和漏的,畢竟taint是基於流量的,若是沒有人點擊那個url,是不可能檢測出來的,能夠用一個笨方法來解決,如今的情景下,光靠檢測工具是可能的,只能說依靠工具輔助人來提升效率而已。url