为了防止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,那么& there将会转义并显示为& amp;,不是吗?
那么我们该如何处理这种情况呢?当然,有人可能会说,那么不要使用htmlspecialchar,直接按原样返回就可以了。
但是,有人可能会给我们发送一个company_name,它是精心设计的,用来停止文本框,启动javascript onclick,然后从那里执行XSS。
在这些情况下你是如何处理htmlescape的?只使用history.go(-1)?
发布于 2013-02-27 02:33:02
如果您有兴趣了解更多关于预防XSS的知识,我强烈建议您查看OWASP XSS prevention cheat sheet。
当浏览器呈现HTML (以及相关内容,如CSS)时,它会为不同类型的输入标识不同的呈现上下文。对于如何以及何时可以执行脚本代码,每个上下文都有不同的语义。因此,浏览器处理超文本标记语言的规则与用于呈现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转义引号。未转义的引号可用于“中断”属性并添加JavaScript事件处理程序,如"onclick“、”onfocus“等。
在您的"AT&T“示例中,您不会在输入框中看到&。这是因为在超文本标记语言属性的上下文中,浏览器将超文本标记语言实体(如&)呈现为它们的相关字符(如&)。
什么时候可以在文本框中看到&?
如果您使用JavaScript修改输入值,您的浏览器将使用一组不同的规则来确定如何处理新值。如果您使用HTML对'AT&T‘进行转义,然后使用如下命令插入新值。yourInput.setAttribute(“value”, HtmlEscapingFunction('AT&T')),用户将看到AT&T。这是因为您现在是在DOM执行上下文中工作,而在DOM执行上下文中,HTML对属性值进行转义会导致双重编码。
https://stackoverflow.com/questions/9253237
复制相似问题