1

为了防止 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,则 & 将转义并显示为 & amp; 不是吗?

那么我们该如何应对这种情况呢?当然,有人可能会说,那就不要htmlspecialchar了,直接返回就行了?

但随后有人可能会向我们发送一个精心设计的 company_name,以阻止文本框启动 javascript onclick 并从那里执行 XSS。

在这些情况下,您如何处理 htmlescape?只需使用 history.go(-1)?

4

1 回答 1

1

如果您有兴趣了解有关预防 XSS 的更多信息,我强烈建议您查看OWASP XSS 预防备忘单。

当浏览器呈现 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&T”示例中,您不会&amp;在输入框中看到。这是因为在 HTML 属性的上下文中,您的浏览器将 HTML 实体(如&amp;)呈现为它们的关联字符(如 &)。

您什么时候可以&amp;在文本框中看到?

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

于 2013-02-26T18:33:02.377 回答