文章字数:647,阅读全文大约需要2分钟
HTTP头中的Content-Security-Policy字段有若干指令,可以设置指定的策略允许的源
指令
default-src: 可以为其它指令提供备选项child-src:元素加载的嵌套浏览上下文connect-src指令用于控制允许通过脚本接口加载的链接地址,影响下面的
<a>pingFetchXMLHttpRequestWebSocketEventSource
font-src字体的地址被阻止1
2
3
4@font-face {
font-family: "MyFont";
src: url("https://not-example.com/font");
}frame-src<frame>标签和<iframe>指定源的限制img-srcHTTP 指令指定图像和图标的有效来源manifest-srcmanifest是一个资源允许的列表media-src<audio>和<video>元素的有效源object-srcscript-src<script>标签style-src<style>标签worker-srcWorkerSharedWorkerServiceWorker
语法
一个或者多个源
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’ 都会被忽略