ぺらたんからのタレコミ。
CodeIgniterの1.7.3や2系でxss_cleanの挙動が不思議らしい。
例えば「EPA&DHA」の文字列をxss_cleanにかけると「EPA&DHA;」となるらしい。
xss_cleanの該当箇所を抜き出して試してみた。
<?php $str = 'EPA&DHA'; $hash = '901119URL5918AMP18930PROTECT8198'; $str = preg_replace('|\&([a-z\_0-9]+)\=([a-z\_0-9]+)|i', $hash."\\1=\\2", $str); echo $str . "\n"; $str = preg_replace('#(&\#?[0-9a-z]{2,})([\x00-\x20])*;?#i', "\\1;\\2", $str); echo $str . "\n"; $str = preg_replace('#(&\#x?)([0-9A-F]+);?#i',"\\1\\2;",$str); echo $str . "\n"; $str = str_replace($hash, '&', $str); echo $str . "\n"; $str = rawurldecode($str); echo $str . "\n";
実行結果
$ php ci_xss_test.php EPA&DHA EPA&DHA; EPA&DHA; EPA&DHA; EPA&DHA;
$str = preg_replace('#(&\#?[0-9a-z]{2,})([\x00-\x20])*;?#i', "\\1;\\2", $str);
ここが原因みたい。
&のあと2文字以上なら「;」挿し込む?
ちょっと意味が分かっていない・・・。
そもそもxss対策を全部自前でやってるのはどうなのかな?
ちょっとぐぐってみたら
CodeIgniterのGlobal XSS Filteringには要注意?
とか出てきた。
あんまり使わないほうがいいのかなー。