杜绝跨域脚本攻击,Content Security Policy 介绍

浏览器兼容性

先看一张图

禾令奇_20170412142732.png

Content Security Policy,简称 CSP。顾名思义,这个规范与内容安全有关,主要是用来定义页面可以加载哪些资源,减少 XSS 的发生。

Chrome 扩展已经引入了 CSP,通过 manifest.json 中的 content_security_policy 字段来定义。一些现代浏览器也支持通过响应头来定义 CSP。下面我们主要介绍如何通过响应头来使用 CSP,Chrome 扩展中 CSP 的使用可以参考 Chrome 官方文档

如何使用

要使用 CSP,只需要服务端输出类似这样的响应头就行了:

Content-Security-Policy: default-src 'self'

如本站的

<meta http-equiv="Content-Security-Policy" content="default-src 'self' *.helingqi.com www.google-analytics.com 'unsafe-inline' 'unsafe-eval';">

default-src 是 CSP 指令,多个指令之间用英文分号分割;'self' 是指令值,多个指令值用英文空格分割。常用CSP 指令:

指令 指令值示例 指令说明
default-src 'self' imgcdn.helingqi.com 默认加载策略
script-src 'self' js.helingqi.com 对 JavaScript 的加载策略。
style-src 'self' css.helingqi.com 对样式的加载策略。
img-src 'self' img.helingqi.com 对图片的加载策略。
connect-src 'self' 对 Ajax、WebSocket 等请求的加载策略。
不允许的情况下,浏览器会模拟一个状态为 400 的响应。
font-src font.imgcdn.helingqi.com 针对 WebFont 的加载策略。
object-src 'self' 针对 <object>、<embed> 或 <applet> 等标签引入的 flash 等插件的加载策略。
media-src media.imgcdn.helingqi.com 针对媒体引入的 HTML 多媒体的加载策略。
frame-src 'self' 针对 frame 的加载策略。
report-uri /report-uri 告诉浏览器如果请求的资源不被策略允许时,往哪个地址提交日志信息。 特别的:如果想让浏览器只汇报日志,不阻止任何内容,可以改用 Content-Security-Policy-Report-Only 头。

指令值可以由下面这些内容组成:

指令 指令值示例 说明
* img-src * 允许任何内容。
'none' img-src 'none' 不允许任何内容。
'self' img-src 'self' 允许来自相同来源的内容(相同的协议、域名和端口)。
data: img-src data: 允许 data: 协议(如 base64 编码的图片)。
www.helingqi.com img-src img.helingqi.com 允许加载指定域名的资源。
*.helingqi.com img-src *.helingqi.com 允许加载 helingqi.com 任何子域的资源。
'unsafe-inline' script-src 'unsafe-inline' 允许加载 inline 资源(例如常见的 style 属性,onclick,inline js 和 inline css 等等)。
'unsafe-eval' script-src 'unsafe-eval' 允许加载动态 js 代码,例如 eval()。

从上面的介绍可以看到,CSP 协议可以控制的内容非常多。而且如果不特别指定 'unsafe-inline' 时,页面上所有 inline 样式和脚本都不会执行;
不特别指定 'unsafe-eval',页面上不允许使用 new Function,setTimeout,eval 等方式执行动态代码。

本站采用「署名 4.0 国际(CC BY 4.0)」创作共享协议,转载请注明本文出处及链接。

Tags: Chrome,,地址,csp,加载,指令,self',img-src

文章翻页

头像
游客
发表评论
  1. 情醉中国风

    好高级,小白看不懂 犀利.png

  2. 惊讶.png 惊讶.png 惊讶.png 礼物.png 礼物.png 礼物.png 勉强.png