1.CSP 简介

内容安全策略(Content Security Policy,简称CSP)是一种以可信白名单作机制,来限制网站是否可以包含某些来源内容,缓解广泛的内容注入漏洞,比如 XSS。 简单来说,就是我们能够规定,我们的网站只接受我们指定的请求资源。默认配置下不允许执行内联代码(

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 : 定义针对多媒体的加载策略,例如:音频标签和视频标签。
  • object-src : 定义针对插件的加载策略,例如:、、。
  • child-src :定义针对框架的加载策略,例如: ,。
  • connect-src : 定义针对 Ajax/WebSocket 等请求的加载策略。不允许的情况下,浏览器会模拟一个状态为400的响应。
  • sandbox : 定义针对 sandbox 的限制,相当于 的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除了使用白名单机制外,默认配置下阻止内联代码执行是防止内容注入的最大安全保障。
这里的内联代码包括:

(1) 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.参考链接

http://www.ruanyifeng.com/blog/2016/09/csp.html
http://blog.topsec.com.cn/ad_lab/content-security-policy/
https://blog.csdn.net/qq_37943295/article/details/79978761
https://www.jianshu.com/p/b223c5b9d5ab
https://content-security-policy.com/
https://www.imuo.com/a/f7566a17dcfe788216bbc5245e91a631fcc259bfac97dc7f94bf8002ba38fa21
https://w3c.github.io/webappsec-csp/#intro
https://kuaibao.qq.com/s/20180522G095D900?refer=spider

博主简介:博主国内安全行业目前最强大的网络安全公司做技术研究员,常年做技术工作。 获得过以下全国竞赛大奖: 《中国电子作品大赛一等奖》 《云计算技术大赛一等奖》 《AIIA人工智能大赛优胜奖》《网络安全知识竞赛一等奖》 《高新技术个人突出贡献奖》,并参与《虚拟化技术-保密》一书编写,现已出版。还拥有多项专利,多项软件著作权! 且学习状态上进,立志做技术牛逼的人。座右铭:在路上,永远年轻,永远热泪盈眶。可邮件联系博主共同进步,个人邮箱:pigeon_code@163.com

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

  1. http内容安全策略Content Security Policy(CSP)

    内容安全策略CSP是安全性的附加层,有助于检测和缓解某些类型的攻击,包括跨站点脚本(Cross Site Scripting (XSS) Software Attack | OWASP Foundat ...

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

    看到标题,是否有点疑惑 CPS 是什么东东.简单介绍一下就是浏览器的安全策略,如果 标签,或者是服务器中返回 HTTP 头中有 Content-Security-Policy 标签 ,浏览器会根据标签 ...

  3. Web 实时消息推送详解

    title: Web 实时消息推送详解 category: 系统设计 head: meta name: keywords content: 消息推送,短轮询,长轮询,SSE,Websocket,MQT ...

  4. Android 应用程序之间内容分享详解(二)

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9428613 Android 应用程序之间内容分享详解(一) 之前给大家分享了你开发的应 ...

  5. Android开发笔记(3) 应用程序之间内容分享详解

    PS:改变文章标题只为更加详细说明功能和排版,以方便日后复习.这两篇文章已经写得很详细 Android 应用程序之间内容分享详解(一) 转载请注明地址:http://blog.csdn.net/xia ...

  6. 攻防世界web进阶区wtf.sh-150详解

    攻防世界web进阶区wtf.sh-150详解 题目 详解 题目 看起来像一个论坛,可以注册,登录 详解 我们随便打开一个 尝试注入 并没有发现可以注入 注册发现,admin已经存在, 我们看看能不能二 ...

  7. java 控制jsp_JSP学习之Java Web中的安全控制实例详解

    普通用户界面 修改登录的Servlet,修改后的代码如下: LoginProcess.java代码: package servlet; import javabean.User; import jav ...

  8. Spring中,applicationContext.xml 配置文件在web.xml中的配置详解

    Spring中,applicationContext.xml 配置文件在web.xml中的配置详解 2016年10月04日 15:22:26 阅读数:7936 转自http://www.cnblogs ...

  9. php jwt token 解析,JSON Web Token(JWT)入坑详解

    JSON Web Token(JWT)入坑详解 龙行    PHP    2019-6-17    1651    0评论 /** JWT生成类 **/ class Jwt { private $al ...

最新文章

  1. 解决 Windows10 和 Ubuntu18.04.4 双系统 时间同步不一致问题
  2. 华为H3C ER3100由器限速方法合集
  3. linux 死锁分析
  4. 线段树HDU1698(成段更新)
  5. stringBuffer、StringBuilder、排序、Arrays、Jdk1.5新特性(java基础知识十三)
  6. Android笔记 - Android studio如何添加arr库
  7. 数据集可以导入mysql_利用数据集进行数据访问操作
  8. OpenShift 4 之Istio-Tutorial (11) 控制Egress访问
  9. java 计时 timeclock_用 java 写一个clock的类,100毫秒的时钟 求代码。。越简单越好。。最好有注释...
  10. USACO_Prime Cryptarithm
  11. pdf417条形码开发
  12. python分词原理_结巴分词原理
  13. win的反义词_小学英语反义词汇总大全,这样背单词事半功倍!
  14. SDUTOJ3689
  15. echarts 实现图表缩放功能 dataZoom自带属性实现
  16. html 禁止触摸事件,html5的触摸事件
  17. ES6学习笔记2:字符串的repeat()方法
  18. 上大学之前,一定要明白这10大潜规则,你会少走很多人生弯路
  19. BEA CEO庄思浩清华大学演讲(2002/12)
  20. python井字棋最大最小算法_python井字棋算法及代码

热门文章

  1. 石头剪刀布自学习人工智能
  2. 大型网站概念及解决方案
  3. 天天向上续 python代码_第46p,8行代码,用Python批量重命名文件
  4. super关键字,多态
  5. memento -对象行为型模式
  6. SpringMVC从入门到精通(全)
  7. js实现全屏,退出全屏功能
  8. web应用安全测试之信息泄露
  9. kali2020识别不到网卡_kali无法识别BCM43XX系列无线网卡
  10. linux互联网远程控制,VNC远程控制LINUX 之一