了解什么是CSP

1,575 阅读2分钟

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

  1. 设置 HTTP Header 中的 Content-Security-Policy
  • default-src ‘self’ : 只允许加载本站资源

  • img-src https://* : 只允许加载 HTTPS 协议图片

  • child-src 'none' :允许加载任何来源框架

比如:
Content-Security-Policy: default-src ‘self’
  1. 设置 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 的兼容性也不错。

参考:

www.zhihu.com/question/21…