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-srcconnect-srcfont-srcimg-srcmanifest-srcmedia-srcobject-srcscript-srcstyle-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
DeprecatedSafari 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