注意:但凡是sql注入漏洞的程序,都是因為程序要接受來自客戶端用戶輸入的變量或URL傳遞的參數,并且這個變量或參數是組成sql語句的一部分。對于用戶輸入的內容或傳遞的參數,我們應該要時刻保持警惕,這是安全領域里的【外部數據不可信任】的原則。縱觀web安全領域的各種攻擊方式,大多數都是因為開發者違反了這個原則而導致的。所以自然能想到,就是變量的檢測、過濾、驗證下手,確保變量是開發者所預想的。
1. 檢查變量數據類型和格式 數據類型檢查,sql執行前,要進行數據類型檢查,如果是郵箱,參數就必須是郵箱的格式,如果是日期,就必須是日期格式;
只要是有固定格式的變量,在SQL語句執行前,應該嚴格按照固定格式去檢查,確保變量是我們預想的格式,這樣很大程度上可以避免SQL注入攻擊。如果上述例子中id是int型的,效果會怎樣呢?無法注入,因為輸入注入參數會失敗。比如上述中的name字段,我們應該在用戶注冊的時候,就確定一個用戶名規則,比如5-20個字符,只能由大小寫字母、數字以及漢字組成,不包含特殊字符。此時我們應該有一個函數來完成統一的用戶名檢查。不過,仍然有很多場景并不能用到這個方法,比如寫博客,評論系統,彈幕系統,必須允許用戶可以提交任意形式的字符才行,否則用戶體驗感太差了。
2. 過濾特殊符號
3. 綁定變量,使用預編譯語句