Skip to content

今天我要来聊聊CSP(Content Security Policy)内容安全策略,这是HTTP层的内容,主要目的就是设置安全白名单,前面我已经介绍过**XSS跨站脚本攻击**,CSP的作用主要就是防止加载不安全的内容,就算网站有可以注入JS脚本的地方,只要不加载和访问外部资源,也会相对安全些。

如何启用CSP

启用CSP的方法有两种:服务器配置Http头,在html页面设置Meta标签。

就拿Apache来说,将如下代码加入到httpd.conf文件中的virtualHost中:

Header set Content-Security-Policy "default-src 'self';"
Header set Content-Security-Policy "default-src 'self';"

此配置的意思是告诉客户端浏览器,默认除了self自己本身服务器的资源,加载其他资源一律阻止。 如果是Meta方式,如下代码:

html
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';" \>
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';" \>

上面的img-src意思是图片只能加载支持https协议的资源,childe-src是所有Web Workers和一些iframe外部资源都阻止加载。

CSP指令选项

上面只是简单的介绍了一些指令,CSP提供许多指令选择,我简单介绍下,需要使用还是要看官方文档。

connect-src 连接资源

指定可访问的连接源,如 XHR, WebSockets, 和 EventSource发起的外部请求。

font-src 字体资源

指定可访问的字体资源,如google font的字体。

frame-src 内嵌框架

指定可访问的内嵌框架资源,使用frame或者iframe嵌入在网页中的外部资源。

script-src JS脚本资源

指定可访问的外部JS脚本资源。

style-src 样式资源

指定可访问的外部CSS资源。

media-src 媒体资源

指定可访问的外部媒体资源,如<video>、<audio>、<track>元素等。

CSP的指令选项还有不少,可以参看MDN的CSP文档

CSP选项值

上面列举了一些常用的CSP选项,那如何使用呢?下面这段直接从阮一峰老师的博客Copy过来了:

  • 主机名:example.orghttps://example.com:443
  • 路径名:example.org/resources/js/
  • 通配符:*.example.org*://*.example.com:*(表示任意协议、任意子域名、任意端口)
  • 协议名:https:data:
  • 关键字'self':当前域名,需要加单引号
  • 关键字'none':禁止加载任何外部资源,需要加单引号

举个例子:

Content-Security-Policy: script-src 'self' https://*.seozen.top
Content-Security-Policy: script-src 'self' https://*.seozen.top

上面一个白名单表示:除了自身域名和所有seozen.top域名是https协议的,其余外部JS资源一律阻止加载,即使是http://www.helloyu.top这样的域名也是无法加载的,因为协议不符合要求。

如果有多个外部资源,可以并排,中间使用空格分割,一种选项末尾使用;分割,如:

Content-Security-Policy: default-src https://cdn.example.net; child-src 'none'; object-src 'none'
Content-Security-Policy: default-src https://cdn.example.net; child-src 'none'; object-src 'none'

今天关于CSP的文章就分享到这,想要更深入了解可以参考下面的链接:

Content Security Policy - Google Web Fundamentals

阮一峰CSP教程

Content Security Policy Reference Guide

Content-Security-Policy MDN