CSP 指令集
减少 XSS(Cross-site scripting)攻击
或者头, 感觉 meta 灵活点,多页面一致性 header 方便,兼容好
Header 和 meta 会选限制最大的:https://stackoverflow.com/questions/51148998/what-is-happening-when-i-have-two-csp-content-security-policies-policies-hea
Meta 标签的 Content-Security-Policy-Report-Only 方式在当前(2016/5/19)多数移动端浏览器上表现正常,但是 不推荐 这样做,如 chrome 50 会产生如下的提示
The report-only Content Security Policy xxxxxxx was delivered via a element,which is disallowed. The policy has been ignored.
指令 | 取值示例 | 说明 |
default-src | ‘self’ cdn.example.com | 定义针对所有类型(js/image/css/web font/ajax/iframe/多媒体等)资源的默认加载策略,某类型资源如果没有单独定义策略,就使用默认。 |
script-src | ‘self’ js.example.com | 定义针对JavaScript的加载策略 |
object-src | ‘self’ | 针对object,embed, 等标签的加载策略 |
style-src | ‘self’ css.example.com | 定义针对样式的加载策略 |
img-src | ‘self’ image.example.com | 定义针对图片的加载策略 |
media-src | ‘media.example.com’ | 针对或者引入的html多媒体等标签的加载策略 |
‘self’ | 针对iframe的加载策略 | |
connect-src | ‘self’ | 针对Ajax、WebSocket等请求的加载策略。不允许的情况下,浏览器会模拟一个状态为400的响应 |
font-src | font.qq.com | 针对Web Font的加载策略 |
sandbox | allow-forms allow-scripts | 对请求的资源启用sandbox |
report-uri | /some-report-uri | 告诉浏览器如果请求的资源不被策略允许时,往哪个地址提交日志信息。不阻止任何内容,可以改用Content-Security-Policy-Report-Only头 |
base-uri | ‘self’ | 限制当前页面的url(CSP2) |
child-src | ‘self’ | 限制子窗口的源(iframe、弹窗等),取代frame-src(CSP2) |
form-action | ‘self’ | 限制表单能够提交到的源(CSP2) |
frame-ancestors | ‘none’ | 限制了当前页面可以被哪些页面以iframe,frame,object等方式加载(CSP2) |
plugin-types | application/pdf | 限制插件的类型(CSP2) |
指令值示例及说明
指令值 | 示例 | 说明 |
* | img-src * | 允许任何内容 |
‘none’ | img-src ‘none’ | 不允许任何内容 |
‘self’ | img-src ‘self’ | 允许同源内容 |
data: | img-src data: | 允许data:协议(如base64编码的图片) |
img-src www.a.com | 允许加载指定域名的资源 | |
*.a.com | img-src *.a.com | 允许加载a.com任何子域的资源 |
img-srchttps://img.com | 允许加载img.com的https资源 | |
https: | img-src https: | 允许加载https资源 |
‘unsafe-inline’ | script-src ‘unsafe-inline’ | 允许加载inline资源(style属性,onclick,inline js和inline css等等) |
‘unsafe-eval’ | script-src ‘unsafe-eval’ | 允许加载动态js代码,例如eval() |
'unsafe-dynamic' script-src 'unsafe-dynamic' 'nonce-$NONCE'
运行加载nonce或hash指定的白名单不安全动态脚本