内容安全策略(Content Security Policy,简称 CSP)是一种工具,允许开发人员指定在通过 Web 浏览器访问 Storefront 页面时允许加载哪些位置和哪些类型的资源。
可以使用内容安全策略来锁定店面应用程序,并降低内容注入漏洞的风险,例如跨站点脚本 (XSS)、代码注入和点击劫持攻击(clickjacking),以及降低您的店面应用程序执行的权限。
Target Policy
指令可以使用 HTTP 响应标头(服务器可以发送多个具有给定资源表示的 CSP HTTP 标头字段,并且服务器可以发送具有相同资源或不同资源的不同表示的不同 CSP 标头字段值)或 HTML Meta 标记,下面的 HTTP 标头由规范定义:
Content-Security-Policy :由 W3C 规范定义为标准标头,由 Chrome 25 及更高版本、Firefox 23 及更高版本、Opera 19 及更高版本使用。
X-Content-Security-Policy :Firefox 直到版本 23 和 Internet Explorer 版本 10(部分实现内容安全策略)使用。
X-WebKit-CSP : Chrome 使用直到版本 25
default-src :为所有资源类型定义加载策略,以防未定义资源类型专用指令(回退),
script-src :定义受保护资源可以执行的脚本,
csp 是一个 W3C 规范,提供了指示客户端浏览器从哪个位置和/或允许加载哪种类型的资源的可能性。 为了定义加载行为,CSP 规范使用“指令”,其中指令定义目标资源类型的加载行为。
在 Content-Security-Policy 安全标头中,可以指定定义目标资源类型的加载行为的指令。 以下是推荐的指令和相应的目标:
default-src ‘self’; style-src ‘self’ ‘unsafe-inline’; img-src ‘self’
支持的指令有:
default-src :为所有资源类型定义加载策略,以防未定义资源类型专用指令(回退),
script-src :定义受保护资源可以执行的脚本。
在 Backoffice 里的设置
除了 SAP Commerce Platform 提供的安全机制外,Backoffice Framework 还提供额外的安全功能来确保 Storefront 应用的安全性。
Backoffice Framework 中的安全标头可以准确地告诉您的浏览器在处理您网站的内容和数据时的行为方式。
我们确保在 Backoffice Framework 应用程序上下文中应用安全标头,例如,与 /backoffice/* 路径一起应用。 来自 /backoffice/* 以外的资源的响应不一定具有这些标头。 在与 Backoffice Framework 的网络通信中,每个响应都有以下标头:
Header Content-Security-Policy (CSP): default-src ‘self’; script-src ‘self’’ ‘unsafe-inline’ ‘unsafe-eval’; connect-src ‘self’’; img-src ‘self’ data:; style-src ‘self’ ‘unsafe-inline’; font-src ‘self’’, 设置要在网站上加载的内容的批准来源,支持例如图像、HTML 框架和音频文件。可以预防 XSS, code injection 和 clickjacking
Header X-XSS-Protection:1; mode=block,当检测到反射 XSS 时阻止页面加载。 旧类型的浏览器最需要它。 值 1 启用 XSS 过滤。 使用其他值时,页面不会被清理。 添加值块时,不会呈现页面。 当设置值报告 reporting URI 时,页面会被清理并发送违规报告。可以预防 Compromising cookies, tokens, and XSS such as JavaScript Keylogger
Header Strict-Transport-Security (HSTS):max-age=31536000; includeSubDomains,自动将 http 链接转为 https,当连接的安全性无法保证时,例如 TLS 证书不可信时,不允许用户访问 Web 应用程序并返回错误。可以预防 Protocol downgrade attacks, cookies hijacking.
Header X-Frame-Options: SAMEORIGIN. DENY 设置不允许在任何地方显示页面,即使在同一页面上也不允许。SAMEORIGIN 允许将页面嵌入到提供该页面的站点的框架中。可以预防 Clikjacking, and embedding a page into other pages.
可以通过更改 project.properties 文件来覆盖默认值,从而减少限制:
#security headers backoffice.response.header.X-Frame-Options=SAMEORIGIN backoffice.response.header.Strict-Transport-Security=max-age=31536000; includeSubDomains backoffice.response.header.X-XSS-Protection=1; mode=block backoffice.response.header.X-Content-Type-Options=nosniff backoffice.response.header.Content-Security-Policy=default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; connect-src 'self'; img-src 'self' data: ; style-src 'self' 'unsafe-inline'; font-src 'self'