CSP介绍
CSP旨在减少(注意这里是减少而不是消灭)跨站脚本攻击。
CSP 本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截是由浏览器自己实现的。我们可以通过这种方式来尽量减少 XSS 攻击。
几种Content-Security-Policy设置(响应头里设置)
- CSP策略在默认的情况下是不允许使用data URIs资源的,如果要使用,那么需要显示的指定,比如:img-src 'self' data:
- script-src:在处理脚本资源的时候设置"unsafe-inline"可以阻止内联Js代码的执行。使用unsafe-eval开关可以禁止eval,setTimeout,setInterval函数的执行。
- object-src:控制embed,code,archive applet等对象。
- style-src:会控制样式表@import和rel时所引入的URI资源,设置unsafe-inline规则可以是浏览器拒绝解析内部样式和内联样式定义。并不会阻止链入外部样式表。
- img-src:可以控制图片资源的连接,包括img标签的src属性,以及CSS3中的url()和image()方法,以及link标签中的href属性(当rel设置成与图像相关的值,比如HTML支持的icon)
- media-src:控制媒体类型的外部链入资源,如video, audio, source, 和track标签的src属性。frame-src:控制内嵌框架包含的外部页面连接:iframe or a frame。
- font-src:控制CSS中的@font-face
- connect-src:控制XMLHttpRequest中的open(),WebSocket,EventSource
- inline script和eval类型函数(包括eval、setInterval、setTimeout和new Function())是不被执行的。另外data URIs也是默认不允许使用的,XBL,只允许通过chrome:和resource:形式uri请求的XBL,其它的比如在CSS中通过-moz-binding来指定的XBL则不允许被执行。
通常可以通过两种方式来开启 CSP
- 设置 HTTP Header 中的 Content-Security-Policy
-
default-src ‘self’ : 只允许加载本站资源
-
img-src https://* : 只允许加载 HTTPS 协议图片
-
child-src 'none' :允许加载任何来源框架
比如:
Content-Security-Policy: default-src ‘self’
- 设置 meta 标签的方式
<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">
启用后,不符合 CSP 的外部资源就会被阻止加载。
当然可以设置的属性远不止这些,你可以通过查阅文档的方式来学习,这里不过多赘述其他的属性。
对于这种方式来说,只要开发者配置了正确的规则,那么即使网站存在漏洞,攻击者也不能执行它的攻击代码,并且 CSP 的兼容性也不错。
参考: