1

我正在使用 htmlpurifier 库来清理我的传入参数。但它不会过滤空字节(例如 %00)。我错过了什么还是图书馆不支持它?我需要使用 reg-ex 吗?感谢您的任何回答。

编辑:

我正在使用带有配置选项的 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)
4

2 回答 2

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 中没有特殊含义。

如果您想在 URL 中放置一个字符串,请使用 urlencode()。

于 2010-07-19T04:41:14.637 回答
2

如果它出现在 Javascript 代码中,看起来 HTML Purifier 正在正确过滤此字符串。

在 Javascript 中,您希望过滤掉任何出现的结束标记,例如</script>即使它出现在 Javascript 字符串文字中。否则,注入</script>字符串值可能会绕过一些不小心的过滤器,并突破 Javascript 字符串并进入任意 HTML。HTML Purifier 似乎已通过删除该“标签”正确过滤了此内容。

<%00script>如果这确实是它出现的上下文,那么在 Javascript 中的文字字符串中没有任何害处。

另请注意,这%00实际上不是空字节或 PHP,也不是 HTML 或 Javascript 脚本。它是一个百分号,后跟两个零。但是,在 URL 中%00可能确实被解释为空字节,因此%00应该从 URL 中过滤掉。

于 2010-07-19T05:01:42.823 回答