处理htmlescape / htmlspecialchars

时间:2012-02-12 22:16:04

标签: xss htmlspecialchars

要防止XSS,每当您输出回用户输入时(就像您在显示错误输入或使用之前提交的值重新绘制表单时那样),您需要转义html。这是肯定的......

所以,做一些像

这样的事情
echo "the name which was supplied as {$_GET['company_name']} is not accepted" 

不对。

相反,我们会这样做。

echo "the name which was supplied as " . htmlspecialchars($_GET['company_name']) . " is not accepted" 

考虑到这一点,我的问题就出现了;当$ _GET ['company_name']需要显示在它开始的文本框中时,你会怎么做?也许你希望你的用户纠正那个company_name只是因为它太长了?

如果您使用htmlspecialchars,并且如果company_name是AT& T,那么&会有逃脱并显示为&放大器;不是吗?

那么我们如何应对这种情况呢?当然,有人可能会说,那么不要htmlspecialchar它,只是按原样返回它?

但是有人可能会给我们发送一个company_name,它经过精心设计,可以阻止文本框启动javascript onclick并从那里开始执行XSS。

在这些情况下你如何应对htmlescape?只需使用history.go(-1)?

1 个答案:

答案 0 :(得分:1)

如果您有兴趣了解有关预防XSS的更多信息,我强烈建议您查看OWASP XSS prevention cheat sheet

当浏览器呈现HTML(以及相关内容,如CSS)时,它会为不同类型的输入标识不同的呈现上下文。每个上下文都有不同的语义,可用于执行脚本代码的方式和时间。因此,您的浏览器处理HTML的规则与用于呈现JavaScript的规则不同,这些规则与CSS的规则不同,依此类推。这意味着如果您试图阻止XSS,则必须对不受信任的数据放入的上下文非常敏感。

如果您使用像PHP这样的服务器端代码将不安全的值回显到HTML属性(包括表单输入的值),则需要转义HTML属性的文本。假设页面使用的是UTF-8编码,您可能会执行以下操作:

<input type="text" value="<?php echo htmlspecialchars($_GET['company_name'], ENT_QUOTES, 'UTF-8'); ?>" >

“ENT_QUOTES”选项很重要,因为它告诉PHP转换HTML转义引号。未转义的引号可用于“突破”属性并添加JavaScript事件处理程序,如“onclick”,“onfocus”等。

在“AT&amp; T”示例中,您不会在输入框中看到&amp;。这是因为在HTML属性的上下文中,您的浏览器会将HTML实体(如&amp;)呈现为关联字符(例如&amp;)。

您何时可以在文本框中看到&amp;

如果使用JavaScript修改输入值,则浏览器会使用一组不同的规则来确定如何处理新值。如果您要使用HTML转义'AT&amp; T'然后使用类似的东西插入新值。 yourInput.setAttribute(“value”, HtmlEscapingFunction('AT&T')),用户看到AT&amp;T。这是因为您现在正在使用DOM执行上下文,而在DOM执行上下文中,转义属性值的HTML会导致双重编码。