在请求中过滤空字节

时间:2010-07-19 03:51:34

标签: php htmlpurifier

我正在使用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)

2 个答案:

答案 0 :(得分:2)

如HTMLPurifier / EncoderTest.php和HTMLPurifierTest.php所示,HTML Purifier会清除空字节:

    $this->assertPurification("Null byte\0", "Null byte");

    $this->assertCleanUTF8("null byte: \0", 'null byte: ');

也许你应该发布一些代码?

编辑:您的编辑有点误导;实际的输出代码是:

';&amp;lt;%00script&amp;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

相关问题