一、嚴(yán)格的數(shù)據(jù)類型
在Java,C#等高級(jí)語言中,幾乎不存在數(shù)字類型注入,而對(duì)于PHP,ASP等弱類型語言,就存在了危險(xiǎn)。
防御數(shù)字型注入相對(duì)簡單,如果不需要輸入字符型數(shù)據(jù),則可以用is_numeric()、ctype_digit()等函數(shù)判斷數(shù)據(jù)類型。
二、特殊字符轉(zhuǎn)義
字符型注入一般需要單引號(hào)閉合,首先想到的應(yīng)對(duì)方法,就是字符轉(zhuǎn)義。
在PHP中可用addslashes()函數(shù)進(jìn)行轉(zhuǎn)義字符,可以將單雙引號(hào)、反斜線及NULL加上反斜線轉(zhuǎn)義。還可以通過過濾關(guān)鍵字,如:select,union select , order by ,information, table,等等。
在特殊字符轉(zhuǎn)義時(shí),還有另一種更加難以防范的sql注入:二次注入攻擊。
我們寫入數(shù)據(jù)? admin',會(huì)變成? admin\',但是在插入的數(shù)據(jù)庫時(shí)是不帶有反斜杠的, 也就是說數(shù)據(jù)庫中的數(shù)據(jù)還是? admin',這樣的話,如果這個(gè)網(wǎng)站有另一個(gè)地方查詢這個(gè)字段的內(nèi)容,就造成了二次注入攻擊。
三、使用預(yù)編譯語句
預(yù)編譯技術(shù)可以有效的防御sql注入,我開發(fā)是個(gè)弱雞,就不細(xì)細(xì)講解了。
采用預(yù)編譯技術(shù)要注意,不要使用動(dòng)態(tài)拼接sql語句。
簡單來說,動(dòng)態(tài)拼接語句就是字符串連接變量的意思,如:
變量="select.......where id = "+變量;
總之,在存在sql語句的代碼中,一定要謹(jǐn)慎,最好不要用動(dòng)態(tài)拼接SQL語句。