要防止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)?
答案 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”示例中,您不会在输入框中看到&
。这是因为在HTML属性的上下文中,您的浏览器会将HTML实体(如&
)呈现为关联字符(例如&amp;)。
您何时可以在文本框中看到&
?
如果使用JavaScript修改输入值,则浏览器会使用一组不同的规则来确定如何处理新值。如果您要使用HTML转义'AT&amp; T'然后使用类似的东西插入新值。 yourInput.setAttribute(“value”, HtmlEscapingFunction('AT&T'))
,用户将看到AT&T
。这是因为您现在正在使用DOM执行上下文,而在DOM执行上下文中,转义属性值的HTML会导致双重编码。