跳转至

Insecure HTTP Header Setting: Content Security Policy (CSP)

不安全的HTTP标头设置:Content Security Policy (CSP)

描述

Content Security Policy (CSP):是一种计算机安全标准,它增加了一层保护,用于防御跨站脚本 (XSS)、点击劫持以及其他依赖于在可信Web资源上下文中执行恶意内容的客户端攻击。

您可以使用HTTP响应标头中适当的CSP指令,有选择地指定Web应用程序中应允许哪些数据源。本文介绍了如何使用CSP标头保护网站免受XSS攻击以及其他试图绕过同源策略的企图。

可以通过在响应标头中使用 Content-Security-Policy 指令指示浏览器来启用CSP:

 Content-Security-Policy: script-src 'self';

或者在meta标签中启用:

<meta http-equiv="Content-Security-Policy" content="script-src 'self';"> 

在上述示例中,您可以将脚本加载限制为仅限同一域名。它还将限制元素属性和事件处理程序中的内联脚本执行。

在声明CSP时可以使用各种指令:

  • script-src:将脚本加载资源限制为您声明的资源。默认情况下,它会禁用内联脚本执行,除非您通过 unsafe-eval 和 unsafe-inline 关键字允许评估函数和内联脚本。
  • base-uri:base元素用于将相对URL解析为绝对URL。通过使用此CSP指令,您可以定义所有可能分配给文档的 base-href 属性的URL。
  • frame-ancestors:它与 X-Frame-Options HTTP标头非常相似。它定义了页面可以通过 iframe 加载的URL。
  • frame-src / child-src:frame-src 是 child-src 的已弃用版本。两者都定义了页面上可以通过 iframe 加载的源。(请注意,frame-src在CSP 3中已恢复)
  • object-src:定义可以通过嵌入加载的资源,例如Flash文件、Java小程序。
  • img-src:顾名思义,它定义了可以从中加载图像的资源。
  • connect-src:定义 XMLHttpRequest 和 WebSocket 对象的白名单目标。
  • default-src:它是大多数以 -src 后缀结尾的指令的后备选项。当未定义以下指令时,将使用分配给 default-src 的值:
    • child-src
    • connect-src
    • font-src
    • img-src
    • manifest-src
    • media-src
    • object-src
    • script-src
    • style-src

在设置CSP指令时,您还可以使用一些CSP关键字:

  • none:拒绝从任何地方加载资源。
  • self:指向文档的URL(域名+端口)。
  • unsafe-inline:允许运行内联脚本。
  • unsafe-eval:允许执行评估函数,例如 eval()。

除了CSP关键字之外,在为端点定义白名单URL时,您还可以使用通配符或仅使用一个模式 (scheme)。 通配符可用于URL的子域和端口部分:

Content-Security-Policy: script-src https://*.ostorlab.com;
Content-Security-Policy: script-src https://ostorlab.com:*;
Content-Security-Policy: script-src https://ostorlab.com:*;

在迁移期间,也可以将CSP设置为 Report-Only(仅报告)模式,而不是立即强制执行它。因此,在迁移到CSP时,您可以查看在网站当前状态下违反CSP策略的情况:

Content-Security-Policy-Report-Only: script-src 'self'; report-uri: https://ostorlab.com;

浏览器的CSP支持

Content Security Policy 得到所有主流现代浏览器的支持,并且已经支持多年。Internet Explorer不支持它。

Chrome:

  • Content-Security-Policy CSP Level 3 - Chrome 59+(部分支持)
  • Content-Security-Policy CSP Level 2 - Chrome 40+(自2015年1月起完全支持)
  • Content-Security-Policy CSP 1.0 - Chrome 25+
  • X-Webkit-CSP Deprecated - Chrome 14-24

Firefox:

  • Content-Security-Policy CSP Level 3 - Firefox 58+(部分支持)
  • Content-Security-Policy CSP Level 2 - Firefox 31+(自2014年7月起部分支持)
  • Content-Security-Policy CSP 1.0 - Firefox 23+(完全支持)
  • X-Content-Security-Policy Deprecated - Firefox 4-22

Safari:

  • Content-Security-Policy CSP Level 3 - Safari 15.4+(部分支持)
  • Content-Security-Policy CSP Level 2 - Safari 10+
  • Content-Security-Policy CSP 1.0 - Safari 7+
  • X-Webkit-CSP Deprecated Safari 6

Edge:

  • Content-Security-Policy CSP Level 3 - Edge 79+(部分支持)
  • Content-Security-Policy CSP Level 2 - Edge 15+(部分支持,76+完全支持)
  • Content-Security-Policy CSP 1.0 - Edge 12+

Internet Explorer:

  • X-Content-Security-Policy Deprecated - IE 10-11(仅支持沙盒)

建议

  • 在HTTP响应标头中发送 Content-Security-Policy 指示浏览器应用您指定的策略,从而在您的网站上启用CSP。
  • 尽可能严格地应用白名单和策略。
  • 重新扫描您的应用程序,查看Ostorlab是否识别出您的策略存在任何弱点。
  • 使用 frame-src 防止 iFrame 在您的网站上加载:Content-Security-Policy:frame-src 'none'
  • 使用 script-src 防止 JavaScript 在您的网站上加载:Content-Security Policy:script-src 'none'
  • 使用 img-src 限制除图像以外的内容:Content-Security-Policy: default-src 'self'; img-src *;
  • 使用 default-src 仅允许从同源、您的网站及其子域加载内容:Content-Security-Policy: default-src 'self' *.sucuri.net;
  • 仅允许同源的媒体或其他可执行脚本:Content-Security-Policy: default-src 'self'; img-src *; media-src sucuri.net; script-src sucuri.net;
  • 仅允许同源的图像、脚本、表单操作和CSS:default-src 'none'; script-src 'self'; img-src 'self'; style-src 'self';base-uri 'self';form-action 'self'

链接

标准

  • OWASP_ASVS_L3:
    • V2_2_5
  • PCI_STANDARDS:
    • REQ_6_2
    • REQ_6_3
    • REQ_6_4
    • REQ_11_3
  • HIPAA_CONTROLS:
    • SECURITY212
    • SECURITY213