2015-07-20 20 views
0

我想净化一个字符串来防止XSS atack,但是如果一个字符串没有脚本标签但是有html属性,字符串不会被净化。净化Yii中的html字符串

例子:

$str = 'http://www.example.com/54f74"onmouseover%3d"alert(1)"style%3d"position%3aabsolute%3bwidth%3a100%25%3bheight%3a100%25%3btop%3a0%3bleft%3a0%3b"54f74'; 
$purifier = new CHtmlPurifier(); 
var_dump(
    $str, 
    $purifier->purify($str) 
); 

结果:

string 'http://www.example.com/54f74"onmouseover%3d"alert(1)"style%3d"position%3aabsolute%3bwidth%3a100%25%3bheight%3a100%25%3btop%3a0%3bleft%3a0%3b"54f74' (length=145) 
string 'http://www.example.com/54f74"onmouseover%3d"alert(1)"style%3d"position%3aabsolute%3bwidth%3a100%25%3bheight%3a100%25%3btop%3a0%3bleft%3a0%3b"54f74' (length=145) 

回答

1

是的,因为该字符串是有效的XSS-免费的HTML。为了净化它,如果您打算在属性中使用它,您可以使用HTML净化器的内部AttrDef类来手动净化它。对于URLs,你可能需要HTMLPurifier_AttrDef_URI

$def = new HTMLPurifier_AttrDef_URI(); 
$config = HTMLPurifier_Config::default(); 
$context = new HTMLPurifier_Context(); 
$pure_url = $def->validate($your_url, $config, $context); 
+0

我注意到purify使编码特殊字符。有些木头我没有做? –

+0

我不明白你的评论。 –