我正在使用htmlpurifier库来清理我的传入参数。但它没有过滤空字节(例如%00)。我错过了什么或者图书馆不支持吗?我是否需要使用注册表?谢谢你的回答。
修改
我正在使用带有配置选项的htmlpurifier
$config = HTMLPurifier_Config::createDefault();
$config->set('Core', 'Encoding', "UTF-8");
$config->set('Cache', 'SerializerPath', "/webdirs/htmlpurify");
对于测试字符串
';</script><%00script>alert(845122)</script>
我得到了输出
';<%00script>alert(845122)
答案 0 :(得分:2)
如HTMLPurifier / EncoderTest.php和HTMLPurifierTest.php所示,HTML Purifier会清除空字节:
$this->assertPurification("Null byte\0", "Null byte");
和
$this->assertCleanUTF8("null byte: \0", 'null byte: ');
也许你应该发布一些代码?
编辑:您的编辑有点误导;实际的输出代码是:
';&lt;%00script&gt;alert(845122)
这只是一串纯文本,非常安全。百分号在HTML中没有特殊含义。
如果您想在网址中放置字符串,请使用urlencode()。
答案 1 :(得分:2)
看起来HTML Purifier正在正确过滤此字符串,如果它出现在Javascript代码中。
在Javascript中,您希望过滤掉任何结束标记的出现,例如</script>
,即使它出现在Javascript字符串文字中。否则,将</script>
注入字符串值可以绕过一些非小心的过滤器,并将Javascript字符串分解为任意HTML。 HTML Purifier似乎通过删除“标记”正确地过滤了它。
Javascript中的文字字符串中<%00script>
没有任何损害,因为它确实是它出现的上下文。
另请注意,%00
实际上不是空字节或PHP,或HTML或Javascript脚本。它是百分号,后跟两个零。但是,在URL %00
中可能确实会被解释为空字节,因此应该从URL中过滤掉%00
。