CSP(Content Security Policy 内容安全策略)

CSP主要用来定义页面可以加载哪些资源(JS/CSS/FONT/IFRAME/XHR/…),可以有效起到很多安全作用!
作用
- 防止运营商劫持(使用script-src限制指定域的JS代码才能运行,避免运营商插入代码)
- 防止XSS攻击(很多XSS攻击会去引用其他站点恶意代码在本站执行)
- 防止点击劫持
- 防止Android WebView UXSS(禁止iFrame嵌套其他站点内容等)
- …
浏览器支持
Content-Security-Policy
- Chrome 26+
X-WebKit-CSP
- Safari 5.1+
- Chrome 14-25
X-Content-Security-Policy
- Firefox 4+
- Internet Explorer 10+
语法例子:
折叠代码块
复制代码
1 | Content-Security-Policy: default-src 'self' |
PHP用法:
折叠代码块PHP
复制代码
1 | header("Content-Security-Policy: script-src 'self' 'unsafe-inline' 'unsafe-eval'; "); |
策略设置
| 键 | 指令值 | 描述 |
|---|---|---|
| default-src | ‘self’ cdn.wufeifei.com | 定义所有资源类型使用默认加载策略 |
| script-src | ‘self’ js.wufeifei.com | 定义JavaScript加载策略 |
| style-src | ‘self’ css.wufeifei.com | 定义Style样式加载策略 |
| img-src | ‘self’ img.wufeifei.com | 定义image图片加载策略 |
| content-src | ‘self’ | 定义Xhr/Ajax/WebSockets/EventSource等请求的加载策略.不允许的话会出现400 |
| font-src | font.wufeifei.com | 定义Web Font加载策略 |
| object-src | ‘self’ | 定义<object>/<embed>/<applet>等标签引入的flash加载策略 |
| media-src | media.wufeifei.com | 定义<audio>/<video>等标签引入的多媒体加载策略 |
| frame-src | ‘self’ | 定义iframe加载策略.有效防止ClickJacking(点击劫持) |
| sandbox | allow-forms | 定义请求资源使用sandbox |
| report-uri | /report-uri | 定义的策略如果不允许时,将POST一个请求到该地址 |
指令值
| 值 | 说明 |
|---|---|
| * | 允许任何内容 |
| ‘none’ | 不允许任何内容 |
| ‘self’ | 运行同源内容 |
| data | 运行data:协议(Base64图片) |
| www.wufeifei.com | 允许加载指定域 |
| 144.144.144.144 | 允许加载指定IP |
| *.wufeifei.com | 允许加载子域 |
| https://wufeifei.com | 允许加载https指定域 |
| https: | 允许加载https资源 |
| ‘unsafe-inline’ | 允许加载内联资源 |
| ‘unsafe-eval’ | 允许动态加载js,如eval()/newFunction()/setTimeout()/setInterval() |
一.CSP
折叠代码块
复制代码
1 | Content-Security-Policy: 策略(script-src/style-src/...) 指令值(除域名/IP外需要加引号,每个值以空格分隔;策略(每个策略以分号分割) 指令值) |
例子(代码需要加在输出页面内容前):
折叠代码块
复制代码
1 | header("Content-Security-Policy: script-src 'self' 'unsafe-inline' 'unsafe-eval' *.google-analytics.com; "); |
折叠代码块
复制代码
1 | header("Content-Security-Policy: script-src 'self' 'unsafe-inline' 'unsafe-eval'; font-src: 'self' *.google-font.com"); |
二.CSP-REPORT
正式加入生产环境前可以先仅收集一段时间的不匹配规则日志,观察一段时间没有问题再上生产环境。或者仅仅作为监控异常行为来使用也可以!
折叠代码块
复制代码
1 | Content-Security-Policy-Report-Only: script-src 'self'; report-uri http://www.wufeifei.com/csp-report.html |
加入上述代码后定义的加载策略还是会执行,只不过会POST一个Content-Type:的JSON请求到csp-report.html上,格式如下:
折叠代码块
复制代码
1 | {"csp-report":{ |
服务端接收:
折叠代码块PHP
复制代码
1 | $data = file_get_contents("php://input"); |
总结
CSP不支持所有浏览器是硬伤,不过开发工作量低,加上也能改善一部分安全,尤其是移动端基本上都支持!浏览器也一直在更新,还是一个趋势,强烈推荐加入!
更多
- 本文标题:CSP(Content Security Policy 内容安全策略)
- 创建时间:2013-06-24 23:11:45
- 本文链接:https://netlify.076666.xyz/posts/c494
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
复制版权信息