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