内容安全策略 (CSP) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。无论是数据盗取、网站内容污染还是散发恶意软件,这些攻击都是主要的手段。
CSP 被设计成完全向后兼容,不支持 CSP 的浏览器也能与实现了 CSP 的服务器一样正常运行,只是在不支持 CSP 的浏览器会忽略它,默认为网页内容使用标准的同源策略。如果网站不提供 CSP 头部,浏览器也使用标准的同源策略。
为使 CSP 可用,你需要配置你的网络服务器返回 Content-Security-Policy HTTP 头部 ( 有时你会看到一些关于X-Content-Security-Policy头部,那是旧版本)。
除此之外, 元素也可以被用来配置该策略,例如
跨站脚本攻击
CSP 的主要目标是减少和报告 XSS 攻击 ,XSS 攻击利用了浏览器对于从服务器所获取的内容的信任。恶意脚本在受害者的浏览器中得以运行,因为浏览器信任其内容来源,即使有的时候这些脚本并非来自于它本该来的地方。
CSP 通过指定有效域——即浏览器认可的可执行脚本的有效来源——使服务器管理者有能力减少或消除 XSS 攻击所依赖的载体。一个 CSP 兼容的浏览器将会仅执行从白名单域获取到的脚本文件,忽略所有的其他脚本 (包括内联脚本和 HTML 的事件处理属性)。
作为一种终极防护形式,始终不允许执行脚本的站点可以选择全面禁止脚本执行。
除限制可以加载内容的域,服务器还可指明哪种协议允许使用;比如 (从理想化的安全角度来说),服务器可指定所有内容必须通过 HTTPS 加载。
使用 CSP
配置内容安全策略涉及到添加 Content-Security-Policy HTTP 头部到一个页面,并配置相应的值,以控制用户代理(浏览器等)可以为该页面获取哪些资源。
你可以使用 Content-Security-Policy HTTP 头部 来指定你的策略,像这样:
Content-Security-Policy: policy
policy 参数是一个包含了各种描述你的 CSP 策略指令的字符串。
描述策略
一个策略由一系列策略指令所组成,每个策略指令都描述了一个针对某个特定类型资源以及生效范围的策略。一个策略可以包含 default-src 或者 script-src 指令来防止内联脚本运行,并杜绝 eval() 的使用。一个策略也可包含一个 default-src 或 style-src 指令去限制来自一个 元素或者 style 属性的內联样式。
CSP: script-src:指令指定 JavaScript 的有效来源。这不仅包括直接加载到 元素中的 URL,还包括可以触发执行内联的脚本事件 ( onclick) 和样式表。
script-src该策略可以允许一个或多个来源:
鉴于此 CSP 标头:
Content-Security-Policy: script-src https://example.com/
以下脚本被阻止,不会被加载或执行:
请注意,内联事件处理程序也被阻止:
您应该用 addEventListener 调用替换它们
如果该指令不存在,用户代理将查找该 default-src指令。
default-src 策略允许指定一个或多个源:
Content-Security-Policy: default-src https://example.com/
或者以下几个值:
'self'
指向与要保护的文件所在的源,包括相同的 URL scheme 与端口号。必须有单引号。一些浏览器会特意排除 blob 与 filesystem 。需要设定这两种内容类型的站点可以在 Data 属性中进行设定。
'unsafe-inline'
允许使用内联资源,例如内联 元素(javascript: URL)、内联事件处理器以及内联
元素。必须有单引号。
'unsafe-eval'
允许使用 eval()
以及相似的函数来从字符串创建代码。必须有单引号。
'none'
不允许任何内容。必须有单引号。
假如设定了其他指令(script-src),那么 default-src 不会对它们起作用。这个首部
Content-Security-Policy: default-src 'self'; script-src https://example.com