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