通过 HTTP header 限制 Javascript 执行

Restrict Javascript execution via HTTP header

我想限制 Javascript 在我的网站上的执行,以防止在浏览器中执行恶意代码。假设我的 HTML 网站可以通过 URI http://a.com/ 访问,我想确保浏览器只执行 http://a.com/script.js 中的脚本。浏览器不应:

有办法实现吗? Google 并没有真正帮助我。

我的首选解决方案是通过 HTTP header,类似于 Cross-origin resource sharing 的解决方案,但我也对其他建议感到满意。

与上面的评论相反,这是一个合理的担忧。该漏洞是 cross-site 脚本 (XSS),只要网站允许用户上传内容,它就可能存在。甚至,例如评论:)

防止 XSS 的传统方法是清理所有 user-supplied 输入,但这可能很乏味且 error-prone。旨在防止 XSS 的 HTTP header 是 Content Security Policy。严格依赖 CSP 进行 XSS 保护的主要问题是 Internet Explorer(甚至版本 11)不支持任何版本的 CSP header(除非自上次我检查后有所更改)。

因此,就目前而言,如果可以的话,CSP 是在您的服务器上启用的一个很好的做法,但您仍然需要清理输入以处理 IE 用户(或使用非常旧的浏览器的用户)。此外,请记住,CSP(在最严格的实施中)甚至会阻止您自己的网站代码执行嵌入式 JavaScript。推荐的做法是首先在 "warn only" 模式下启用 CSP 并检查您的日志以确保您没有搬起石头砸自己的脚。

您要找的是Content Security Policy。这是通过 HTTP 响应的输出实现的 header:

Content-Security-Policy: default-src https://cdn.example.net; frame-src 'none'; object-src 'none'

这绝对值得包含在您的网站上,特别是在您允许用户创作 HTML 内容的情况下。是的,使用 Google Caja, but as the languages of the web are constantly evolving so do the XSS attacks to exploit it. This is why you should always implement a Content Security Policy to protect against this threat. Google implement this on Gmail 等消毒剂尽可能多地去除脚本内容,以防止使用新方法逃避 XSS 过滤器的电子邮件造成任何损害。

请注意,如果您不允许 HTML 来自不受信任来源的内容,那么您应该对输出进行编码(如果在开发网站时正确完成,这并不乏味)。在这种情况下,CSP 是任何编码错误的备份——如果您在您的网站上进行了良好的漏洞评估,它仍然会发现潜在的 XSS 缺陷,即使它受到 CSP 的保护。 CSP 会给你时间来修复它,同时它不会被利用。例如,在 HTML 中,您将 HTML 编码(例如,将 < 转换为 &lt;)。请参阅 OWASP XSS (Cross Site Scripting) Prevention Cheat Sheet 了解更多详情。输入验证也可以作为第二道防线。例如,如果某个字段要求输入 phone 数字,您可以在此处阻止接受字母。您应该通过白名单来做到这一点——只接受您期望的字符,而不是拒绝您认为不好的字符。因此,与其将所有字母添加到黑名单,不如将数字和 -+#() 个字符添加到白名单。

始终确保根据输出上下文正确编码。输出到 JavaScript 需要与 HTML 完全不同的编码。如果您需要在客户端脚本中使用服务器设置变量,我的建议是 always output to HTML 然后使用 DOM 检索值。可能的例外情况将输出到 JSON,其中使用了久经考验的 JSON 编码器。

注意 Internet Explorer does have partial support for CSP. Please see this page for a full breakdown of browser support.