Web 安全之内容安全策略(Content-Security-Policy,CSP)详解

1.CSP 简介

内容安全策略(Content Security Policy,简称CSP)是一种以可信白名单作机制,来限制网站是否可以包含某些来源内容,缓解广泛的内容注入漏洞,比如 XSS。 简单来说,就是我们能够规定,我们的网站只接受我们指定的请求资源。默认配置下不允许执行内联代码(<script>块内容,内联事件,内联样式),以及禁止执行eval() , newFunction() , setTimeout([string], …) 和setInterval([string], …) 。

2.CSP 使用方式

CSP可以由两种方式指定: HTTP Header 和 HTML。

  • 通过定义在HTTP header 中使用:

    "Content-Security-Policy:" 策略集
  • 通过定义在 HTML meta标签中使用:
    <meta http-equiv="content-security-policy" content="策略集">

策略是指定义 CSP 的语法内容。

如果 HTTP 头 与 meta 标签同时定义了 CSP,则会优先采用 HTTP 头的 。

定义后,凡是不符合 CSP策略的外部资源都会被阻止加载。

3.CSP 语法

3.1 策略

每一条策略都是指令与指令值组成:

Content-Security-Policy:指令1 指令值1

策略与策略之间用分号隔开,例如:

Content-Security-Policy:指令1 指令值1;指令2 指令值2;指令3 指令值3

在一条策略中,如果一个指令中有多个指令值,则指令值之间用空号隔开:

Content-Security-Policy:指令a 指令值a1 指令值a2

3.2 CSP 指令

  • default-src : 定义针对所有类型(js/image/css/font/ajax/iframe/多媒体等)资源的默认加载策略,如果某类型资源没有单独定义策略,就使用默认的。
  • script-src : 定义针对 JavaScript 的加载策略。
  • style-src : 定义针对样式的加载策略。
  • img-src : 定义针对图片的加载策略。
  • font-src : 定义针对字体的加载策略。
  • media-src : 定义针对多媒体的加载策略,例如:音频标签<audio>和视频标签<video>
  • object-src : 定义针对插件的加载策略,例如:<object><embed><applet>
  • child-src :定义针对框架的加载策略,例如: <frame>,<iframe>
  • connect-src : 定义针对 Ajax/WebSocket 等请求的加载策略。不允许的情况下,浏览器会模拟一个状态为400的响应。
  • sandbox : 定义针对 sandbox 的限制,相当于 <iframe>的sandbox属性。
  • report-uri : 告诉浏览器如果请求的资源不被策略允许时,往哪个地址提交日志信息。
  • form-action : 定义针对提交的 form 到特定来源的加载策略。
  • referrer : 定义针对 referrer 的加载策略。
  • reflected-xss : 定义针对 XSS 过滤器使用策略。

3.3 CSP 指令值

指令值 说明
* 允许加载任何内容
‘none‘ 不允许加载任何内容
‘self‘ 允许加载相同源的内容
www.a.com 允许加载指定域名的资源
*.a.com 允许加载 a.com 任何子域名的资源
https://a.com 允许加载 a.com 的 https 资源
https: 允许加载 https 资源
data: 允许加载 data: 协议,例如:base64编码的图片
‘unsafe-inline‘ 允许加载 inline 资源,例如style属性、onclick、inline js、inline css等
‘unsafe-eval‘ 允许加载动态 js 代码,例如 eval()

4.CSP 例子

  • 例子1

    所有内容均来自网站的自己的域:

    Content-Security-Policy:default-src ‘self‘
  • 例子2

    所有内容都来自网站自己的域,还有其他子域(假如网站的地址是:a.com):

    Content-Security-Policy:default-src ‘self‘ *.a.com
  • 例子3

    网站接受任意域的图像,指定域(a.com)的音频、视频和多个指定域(a.com、b.com)的脚本

    Content-Security-Policy:default-src ‘self‘;img-src *;media-src a.com;script-src a.com b.com
  • 在线 CSP编写的网址:http://cspisawesome.com/

5.CSP 默认特性

  • 阻止内联代码执行

    CSP除了使用白名单机制外,默认配置下阻止内联代码执行是防止内容注入的最大安全保障。

    这里的内联代码包括:<script>块内容,内联事件,内联样式。

    (1) script代码,<script>……<scritp>

    对于<script>块内容是完全不能执行的。例如:

    <script>getyourcookie()</script>

    (2) 内联事件。

    <a href="" onclick="handleClick();"></a>
    <a href="javascript:handleClick();"></a>

    (3) 内联样式

    <div style="display:none"></div>

    虽然CSP中已经对script-src和style-src提供了使用”unsafe-inline”指令来开启执行内联代码,但为了安全起见还是慎用”unsafe-inline”。

  • EVAL相关功能被禁用

    用户输入字符串,然后经过eval()等函数转义进而被当作脚本去执行。这样的攻击方式比较常见。于是乎CSP默认配置下,eval() , newFunction() , setTimeout([string], …) 和setInterval([string], …)都被禁止运行。

    比如:

    alert(eval("foo.bar.baz"));
    window.setTimeout("alert(‘hi‘)", 10); window.setInterval("alert(‘hi‘)", 10);
    new Function("return foo.bar.baz");

    如果想执行可以把字符串转换为内联函数去执行。

    alert(foo && foo.bar && foo.bar.baz);
    window.setTimeout(function() { alert(‘hi‘); }, 10);
    window.setInterval(function() { alert(‘hi‘); }, 10);
    function() { return foo && foo.bar && foo.bar.baz };

    同样CSP也提供了”unsafe-eval”去开启执行eval()等函数,但强烈不建议去使用”unsafe-eval”这个指令。

6.CSP 分析报告

可以用report-uri指令使浏览器发送HTTP POST请求把攻击报告以JSON格式传送到你指定的地址。接下来给大家介绍你的站点如何配置来接收攻击报告。

  • 启用报告

    默认情况下,违规报告不会发送。为了能使用违规报告,你必须使用report-uri指令,并至少提供一个接收地址。

    Content-Security-Policy: default-src self; report-uri http://reportcollector.example.com/collector.cgi

    如果想让浏览器只汇报报告,不阻止任何内容,可以改用Content-Security-Policy-Report-Only头。

  • 违规报告语法

    该报告JSON对象包含以下数据:

    blocked-uri:被阻止的违规资源
    document-uri:拦截违规行为发生的页面
    original-policy:Content-Security-Policy头策略的所有内容
    referrer:页面的referrer
    status-code:HTTP响应状态
    violated-directive:违规的指令
  • 违规报告例子

    http://example.com/signup.html 中CSP 规定只能加载cdn.example.com的CSS样式。

    Content-Security-Policy: default-src ‘none‘; style-src cdn.example.com; report-uri /test/csp-report.php

    signup.html中的代码类似与这样:

    <!DOCTYPE html>
    <html>
     <head>
       <title>Sign Up</title>
       <link rel="stylesheet" href="css/style.css">
     </head>
     <body>
       ... Content ...
     </body>
    </html>

    你能从上面的代码找出错误吗?策略是只允许加载cdn.example.com中的CSS样式。但signup.html试图加载自己域的style.css样式。这样违反了策略,浏览器会向 http://example.com/test/csp-report.php 发送POST请求提交报告,发送格式为JSON格式。

    {
      "csp-report": {
        "document-uri": "http://example.com/signup.html",
        "referrer": "",
        "blocked-uri": "http://example.com/css/style.css",
        "violated-directive": "style-src cdn.example.com",
        "original-policy": "default-src ‘none‘; style-src cdn.example.com; report-uri /_/csp-reports",
      }
    }

    你从上面可以看到blocked-uri给出了详细的阻断地址 http://example.com/css/style.css,但也并不是每次都是这样。比如试图从 http://anothercdn.example.com/stylesheet.css 加载CSS样式时,浏览器将不会传送完整的路径,只会给出 http://anothercdn.example.com/ 这个地址。这样做是为了防止泄漏跨域的敏感信息。

    服务端csp-report.php代码可以这样写:

    <?php
    $file = fopen(‘csp-report.txt‘, ‘a‘);
    $json = file_get_contents(‘php://input‘);
    $csp = json_decode($json, true);
    foreach ($csp[‘csp-report‘] as $key => $val) {
        fwrite($file, $key . ‘: ‘ . $val . "
    ");
    }
    fwrite($file, ‘End of report.‘ . "
    ");
    fclose($file);
    ?>

7.参考链接

原文地址:https://www.cnblogs.com/ldebug/p/9601878.html

时间: 2024-08-29 21:26:50

Web 安全之内容安全策略(Content-Security-Policy,CSP)详解的相关文章

DVWA 黑客攻防实战(十五) 绕过内容安全策略 Content Security Policy (CSP) Bypass

看到标题,是否有点疑惑 CPS 是什么东东.简单介绍一下就是浏览器的安全策略,如果 标签,或者是服务器中返回 HTTP 头中有 Content-Security-Policy 标签 ,浏览器会根据标签里面的内容,判断哪些资源可以加载或执行.阮一峰老师也有关于CSP 的文章,大家可以看看 看回 DVWA.DVWA 中需求也是很简单的,输入被信任的资源,就能加载或执行资源了. 初级 初级篇,如果不看源码的话.看检查器(F12),也可以知道一些被信任的网站. 其他的网站,大家应该也比较熟悉.而当中的

Content Security Policy (CSP) 内容安全策略总结,及抵御 XSS 攻击

在浏览网页的过程中,尤其是移动端的网页,经常看到有很多无关的广告,其实大部分广告都是所在的网络劫持了网站响应的内容,并在其中植入了广告代码.为了防止这种情况发生,我们可以使用CSP来快速的阻止这种广告植入.而且可以比较好的防御dom xss. CSP使用方式有两种 1.使用meta标签, 直接在页面添加meta标签 <meta http-equiv="Content-Security-Policy" content="default-src 'self' *.xx.co

XSS终结者:Content Security Policy(CSP)

Content Security Policy(CSP)简介 传统的web安全应该主要是同源策略(same origin policy).A网站的代码不能访问B网站的数据,每个域都和其他的域相互隔离,给开发者营造了一个安全沙箱.理论上这是非常聪明的做法,但是实际执行过程中,攻击者使用了各种高招可以推翻这套保护. XSS攻击者把恶意代码注入在网站常规数据里,这样就可以绕过浏览器的同源策略.浏览器相信来自安全域的所有代码.XSS Cheat Sheet是一个古老但是却很有代表性的攻击方式.一旦攻击者

Content Security Policy(CSP)简介(转)

Content Security Policy(CSP)简介 传统的web安全应该主要是同源策略(same origin policy).A网站的代码不能访问B网站的数据,每个域都和其他的域相互隔离,给开发者营造了一个安全沙箱.理论上这是非常聪明的做法,但是实际执行过程中,攻击者使用了各种高招可以推翻这套保护. XSS攻击者把恶意代码注入在网站常规数据里,这样就可以绕过浏览器的同源策略.浏览器相信来自安全域的所有代码. XSS Cheat Sheet 是一个古老但是却很有代表性的攻击方式.一旦攻

Content Security Policy介绍

Content Security Policy https://content-security-policy.com/ The new Content-Security-Policy HTTP response header helps you reduce XSS risks on modern browsers by declaring what dynamic resources are allowed to load via a HTTP Header. 现代浏览器提供的防止XSS攻击

好程序员web前端分享html中meta标签及用法详解

好程序员web前端分享html中meta标签及用法详解,这篇文章给大家介绍了html中meta标签及用法详解,感兴趣的朋友一起看看,Html中meta标签一.meta标签 含义 <meta> 元素 可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. <meta> 标签位于文档的头部,不包含任何内容. <meta> 标签的属性定义了与文档相关联的名称/值对.二.meta 中常用属性 charset? (字符集) 说明:规

Android中内容观察者的使用---- ContentObserver类详解

  转载请注明出处:http://blog.csdn.net/qinjuning 前言: 工作中,需要开启一个线程大量的查询某个数据库值发送了变化,导致的开销很大,后来在老大的指点下,利用了 ContentObserver完美的解决了该问题,感到很兴奋,做完之后自己也对ContentObserver做下总结. ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于 数据库技术中的触发器(Trigger),当ContentObs

使用 /proc 文件系统来访问 linux操作系统 内核的内容 &amp;&amp; 虚拟文件系统vfs及proc详解

http://blog.163.com/he_junwei/blog/static/19793764620152743325659/ http://www.01yun.com/other/20130422/366044.html 使用 /proc 文件系统来访问 Linux 内核的内容 这个虚拟文件系统在内核空间和用户空间之间打开了一个通信窗口 简介: /proc 文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在 Linux? 内核空间和用户空间之间进行通信.在 /proc 文件系统中,

spring security 注解@EnableGlobalMethodSecurity详解

 1.Spring Security默认是禁用注解的,要想开启注解,需要在继承WebSecurityConfigurerAdapter的类上加@EnableGlobalMethodSecurity注解,来判断用户对某个控制层的方法是否具有访问权限 @Configuration@EnableWebSecurity@EnableGlobalMethodSecurity(prePostEnabled = true)public class OAuth2SecurityConfiguration ext