摘要:由于無(wú)視目標(biāo)字符串的編碼,直接按照二進(jìn)制字節(jié)對(duì)字符串添加下劃線(xiàn),會(huì)導(dǎo)致很多注入隱患。傳統(tǒng)的函數(shù)會(huì)直接無(wú)視掉而直接對(duì)后面的加下劃線(xiàn),結(jié)果變成了。防止注入的話(huà),能夠預(yù)編譯是最好,不能的話(huà)應(yīng)該按照當(dāng)前的編碼,用前綴的字符串處理函數(shù)手寫(xiě)一個(gè)。
由于addslashes無(wú)視目標(biāo)字符串的編碼,直接按照二進(jìn)制字節(jié)對(duì)字符串添加下劃線(xiàn),會(huì)導(dǎo)致很多注入隱患。
比如說(shuō)gbk環(huán)境下,有一個(gè)寬字符是xbfx27。雖然它不在gbk的編碼范圍內(nèi),但是會(huì)把它當(dāng)成寬字符解析,攻擊者可以通過(guò)構(gòu)造url參數(shù)等方式傳進(jìn)來(lái)。傳統(tǒng)的addslashes函數(shù)會(huì)直接無(wú)視掉xbf而直接對(duì)后面的x27加下劃線(xiàn),結(jié)果變成了xbfx5cx27。這樣前面兩個(gè)字節(jié)構(gòu)成寬字符,后面的x27就會(huì)多帶帶被解析。
防止注入的話(huà),能夠預(yù)編譯是最好,不能的話(huà)應(yīng)該按照當(dāng)前的編碼,用mb前綴的字符串處理函數(shù)手寫(xiě)一個(gè)。
比如下面這個(gè):
function mb_addslashes($str, $enco) { $retstr = ""; $len = mb_strlen($str, $enco); for($i = 0; $i < $len; $i++) { $chr = mb_substr($str, $i, 1, $enco); if($chr == "