一祈争、嚴(yán)格的數(shù)據(jù)類型
在Java斤程,C#等高級(jí)語(yǔ)言中,幾乎不存在數(shù)字類型注入菩混,而對(duì)于PHP忿墅,ASP等弱類型語(yǔ)言,就存在了危險(xiǎn)沮峡。
防御數(shù)字型注入相對(duì)簡(jiǎn)單疚脐,如果不需要輸入字符型數(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ò)過(guò)濾關(guān)鍵字,如:select,union select , order by ,information, table,等等瞬痘。
在特殊字符轉(zhuǎn)義時(shí)故慈,還有另一種更加難以防范的sql注入:二次注入攻擊。
我們寫入數(shù)據(jù)? admin',會(huì)變成? admin\'框全,但是在插入的數(shù)據(jù)庫(kù)時(shí)是不帶有反斜杠的察绷, 也就是說(shuō)數(shù)據(jù)庫(kù)中的數(shù)據(jù)還是? admin',這樣的話津辩,如果這個(gè)網(wǎng)站有另一個(gè)地方查詢這個(gè)字段的內(nèi)容拆撼,就造成了二次注入攻擊。
三喘沿、使用預(yù)編譯語(yǔ)句
預(yù)編譯技術(shù)可以有效的防御sql注入闸度,我開(kāi)發(fā)是個(gè)弱雞,就不細(xì)細(xì)講解了蚜印。
采用預(yù)編譯技術(shù)要注意莺禁,不要使用動(dòng)態(tài)拼接sql語(yǔ)句。
簡(jiǎn)單來(lái)說(shuō)窄赋,動(dòng)態(tài)拼接語(yǔ)句就是字符串連接變量的意思哟冬,如:
變量="select.......where id = "+變量;
總之,在存在sql語(yǔ)句的代碼中寝凌,一定要謹(jǐn)慎柒傻,最好不要用動(dòng)態(tài)拼接SQL語(yǔ)句。