2010-07-19 53 views
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) 

回答

2

如通过HTMLPurifier/EncoderTest.php和HTMLPurifierTest.php,HTML过滤做清理出空字节:

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

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

也许你应该张贴一些代码?

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

';&amp;lt;%00script&amp;gt;alert(845122) 

这是一串纯文本,完全安全。百分号在HTML中没有特殊含义。

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

+0

指挥官 - 谢谢你的回复。我添加了一些代码,但不确定是否足够。让我知道你是否需要任何其他细节。 – pinaki 2010-07-19 04:50:19

+0

问题是我无法使用html特殊字符作为htmlpurifier的输出。所以我在它上面运行一个html_entity_decode。现在这个值导致了这个问题。他们有什么方法可以告诉htmlpurifier删除脚本标记,即使在两者之间有%00时也是如此? – pinaki 2010-07-20 14:30:46

+1

呃,再来?为什么不能使用HTML特殊字符作为HTML Puriifer的输出?(运行html_entity_decode是做错事的错误方法,并且肯定会导致安全漏洞) – 2010-07-20 17:16:51

2

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

在Javascript中,您希望过滤出结束标记的任何出现,例如</script>,即使它出现在Javascript字符串文字中。否则,将</script>注入到一个字符串值中可以绕过一些不小心的过滤器,并跳出Javascript字符串和任意HTML。 HTML净化器似乎已通过删除该“标签”正确地过滤了这一点。

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

还要注意,%00实际上并不是空字节或PHP,或者是HTML或JavaScript脚本。这是一个百分号,然后是两个零。然而,在一个URL %00可能确实被解释为一个空字节,因此%00应该被过滤掉的URL。

+0

感谢您的回复。我明白%00需要在网址中过滤。你可以请添加一个例子或链接如何在JavaScript端添加htmlpurifier?我只使用它在PHP方面。 – pinaki 2010-07-19 05:34:03