文章字数:647,阅读全文大约需要2分钟
HTTP
头中的Content-Security-Policy
字段有若干指令,可以设置指定的策略允许的源
指令
default-src
: 可以为其它指令提供备选项child-src
:元素加载的嵌套浏览上下文connect-src
指令用于控制允许通过脚本接口加载的链接地址,影响下面的
<a>
ping
Fetch
XMLHttpRequest
WebSocket
EventSource
font-src
字体的地址被阻止1
2
3
4@font-face {
font-family: "MyFont";
src: url("https://not-example.com/font");
}frame-src
<frame>
标签和<iframe>
指定源的限制img-src
HTTP 指令指定图像和图标的有效来源manifest-src
manifest
是一个资源允许的列表media-src
<audio>
和<video>
元素的有效源object-src
script-src
<script>
标签style-src
<style>
标签worker-src
Worker
SharedWorker
ServiceWorker
语法
一个或者多个源
1 | Content-Security-Policy: default-src <source>; |
源
<source>
可以是以下之一:
<host-source>
域名或者ip
地址表示的主机名,外加可选的URL
协议名和端口号,允许在主机名和端口的位置使用通配符*
1
http://*.example.com
<scheme-source>
可以直接指定源(二进制文件,数据等)不推荐使用
一下浏览器会特意排除blob
与filesystem
,可以在这里设置1
2
3
4
5# data:sssssssss
data:uris
mediastream:uris
blob:uris
filesystem:uris'self'
指定与要保护的文件所在的源,包括相同的URL scheme
与端口号。必须有单引号。即同源'unsafe-inline'
允许使用内联资源,script
标签,javascript: URL
之类的'unsafe-eval'
允许使用eval()
以及相似的函数来创建代码'none'
不允许任何内容'nonce-<base64值>'
特定使用一次性加密内联的白名单,服务器必须在每一次传输政策时生成唯一的一次性值,否则有安全问题。<hash-source>
使用sha256
,sha384
,sha512
编码过得内联脚本或样式strict-dynamic
指定对于含有标记脚本(通过附加一个随机数或散列)的信任,应该传播到由该脚本加载的所有脚本。与此同时,任何白名单以及源表达式例如 ‘self’ 或者 ‘unsafe-inline’ 都会被忽略