一、作用:
1、限制资源获取:限制网页当中一系列的资源获取的情况,从哪里获取,请求发到哪个地方
限制方式:
default-src限制全局的和链接有关的作用范围
根据资源类型(connect-src、img-src等),限制资源范围
2、报告资源获取越权:在网页当中获取了一些我们不应该获取的资源的时候,给服务进行报告,报告资源获取越权,然后做出调整
之所以报这个错误,就是我们加了这个头的作用。
如果不是inline脚本,而是外链,则
这个头不仅可以限制文件,还可以限制域名。
这个时候 inline脚本还是不能执行的。如果引入外链的脚本文件,则会报错,
这样就可限制,只能使用我们本站使用的脚本。
还可以限制指定某一个网站。
这个文件已经加载成功了。
如果把指定的网站给去掉
浏览器这端就把它限制掉了,不去发送请求。
我们可以限制全局,也可以限制局部的。也可以限制form表单提交的方向。
如果仅仅这么写,点击按钮,是会跳转到zhihu去的,我们要限制只能跳转本站的话,应该是不能跳转成功的。
这样限制,就不会做任何的跳转了。
更详细的参见:
内容安全策略( CSP )developer.mozilla.org/zh-CN/docs/Web/HTTP/CSP
也可以把default-src 换成指定的文件类型,如img-src script-src
我们还可以让它主动向服务器发一个请求,进行汇报
发送的内容是一个标准的csp-report的内容。
不仅可以在HTTP的头里面写,还可以通过在HTML文档中的meta标签来使用。report-uri只能通过HTTP头部去设置,在HTML的meta标签中是无法使用的。
效果是一样的。
更推荐使用HTTP
选项
1、default-src
: 可以为其它指令提供备选项
2、child-src
:元素加载的嵌套浏览上下文
3、connect-src
指令用于控制允许通过脚本接口加载的链接地址,影响下面的
<a>
ping
Fetch
XMLHttpRequest
WebSocket
EventSource
4、font-src
字体的地址被阻止
@font-face { font-family: "MyFont"; src: url("https://not-example.com/font"); }
5、frame-src
<frame>
标签和<iframe>
指定源的限制
6、img-src
HTTP 指令指定图像和图标的有效来源
7、manifest-src
manifest
是一个资源允许的列表
8、media-src
<audio>
和<video>
元素的有效源
9、object-src
10、script-src
<script>
标签
11、style-src
<style>
标签
12、worker-src
Worker
SharedWorker
ServiceWorker
语法:一个或者多个源
Content-Security-Policy: default-src <source>;
Content-Security-Policy: default-src <source> <source>;
<source>
可以是以下之一:
1、<host-source>
域名或者ip
地址表示的主机名,外加可选的URL
协议名和端口号,允许在主机名和端口的位置使用通配符*
http://*.example.com
2、<scheme-source>
可以直接指定源(二进制文件,数据等)不推荐使用
一下浏览器会特意排除blob
与filesystem
,可以在这里设置
# data:sssssssss
data:uris
mediastream:uris
blob:uris
filesystem:uris
3、'self'
指定与要保护的文件所在的源,包括相同的URL scheme
与端口号。必须有单引号。即同源
4、'unsafe-inline'
允许使用内联资源,script
标签,javascript: URL
之类的
5、'unsafe-eval'
允许使用eval()
以及相似的函数来创建代码
6、'none'
不允许任何内容
7、'nonce-<base64值>'
特定使用一次性加密内联的白名单,服务器必须在每一次传输政策时生成唯一的一次性值,否则有安全问题。
8、<hash-source>
使用sha256
, sha384
, sha512
编码过得内联脚本或样式
9、strict-dynamic
指定对于含有标记脚本(通过附加一个随机数或散列)的信任,应该传播到由该脚本加载的所有脚本。与此同时,任何白名单以及源表达式例如 'self' 或者 'unsafe-inline' 都会被忽略