Content Security Policy减少劫持

什么是CSP?

CSP是由单词 Content Security Policy 的首单词组成,是HTML5带给我们的一套全新主动防御的体系,旨在减少(注意这里是减少而不是消灭)跨站脚本攻击。
CSP是一种由开发者定义的安全性政策性申明,通过CSP所约束的的规责指定可信的内容来源(这里的内容可以指脚本、图片、iframe、fton、style等等可能的远程的资源)。通过CSP协定,让WEB处于一个安全的运行环境中。

白名单

CSP定义了 Content-Security-Policy HTTP头来为你的内容创建一个来源的白名单。浏览器只允许白名单域里的资源和代码执行。这样就算攻击者找到了一个漏洞注入脚本,脚本不在白名单里面照样无法执行。
举例说明:
我们信任m.58.com的代码,我们可以这样定义我们的协议
Content-Security-Policy: script-src 'self' http://m.58.com
script-src控制script标签相关的策略,我们指定了'self'和http://m.58.com作为他的值,浏览器只会下载并执行本域和http://m.58.com的脚本。
更多指令介绍:

  • connect-src
    限制使用XHR,WebSockets,和EventSource的连接源。

  • font-src
    指定字体的下载源。

  • frame-src
    指定frame可以嵌入的连接源。

  • img-src
    指定图片的加载源。

  • media-src
    指定video和audio的数据源。

  • object-src
    指定Flash和其他插件的连接源。

  • style-src
    指定link的连接源。和script-src类似。

默认如果你不指定这些指令的值,将允许所有的来源,例如 font-src:*和不写font-src是等价的。
当然你也可以重写默认值,只要使用default-src就可以。比如:指定了default-src:https://example.com 但是没有指定font-src,那么你的font-src也只能从https://example.com加载。在之前的例子中我们只指定了script-src,这说明我们可以从任何其他的地方加载image,font和其他资源。
你可以为你的web应用指定多个或者一个指令,只需要在HTTP头里面列出来这些值,不同的值之间用“;”来分隔。但是如果你写成 script-src https://host1.com;script-src:https://host2.com,那么第二个script-src将不起作用,正确的写法是:script-src https://host1.com https://host2.com 。
再举一个例子:如果你的静态资源全都来自一个CDN,并且你知道不会有frame和其他插件。你可以这样写
Content-Security-Policy:default-src https://cdn.example.net;frame-src 'none';object-src:'none'
关键词:

  • 'none'
    什么都不匹配。

  • 'self'
    匹配当前的域,不包括子域。

  • 'unsafe-inline'
    允许inline JavaScript 和 CSS。

  • 'unsafe-eval'
    允许 eval,new Function等的执行。

这几个关键词需要用单引号引用起来,如果不引用,则会被认为是域名。

详细内容参考:http://content-security-policy.com/

使用示例

使用CSP时,Web应用可以通过提供一个Content-Security-Policy HTTP头或一个META的HTML元素.不过这样的政策只在当前文档适用而已。
META使用示例:


<meta http-equiv="Content-Security-Policy" content="default-src *.tanx.com *.mmstat.com *.meituan.com https://i.meituan.com/ https://ms0.meituan.com https://mc0.meituan.com 192.168.4.223:9999 *.maoyan.com *.meituan.net www.google-analytics.com wvjbscheme://* imeituan://* *.dianping.com *.dpfile.com 'self' 'unsafe-inline' 'unsafe-eval' blob: data:;">

chrome里查看页面用到哪些域名:

浏览器兼容性

CSP 目前有两版:CSP1和CSP2(有些指令是属于CSP2,比如:child-src、form-action等,详见http://content-security-policy.com/)

两版的支持状态可以在http://caniuse.com/#search=csp
中查到。

参考资料:

http://www.zhihu.com/question/21979782
http://www.2cto.com/Article/201408/327064.html
https://imququ.com/post/content-security-policy-reference.html
https://segmentfault.com/a/1190000003852910
http://content-security-policy.com/

Content Security Policy减少劫持的更多相关文章

  1. Content Security Policy (CSP) 介绍

    当我不经意间在 Twitter 页面 view source 后,发现了惊喜. <!DOCTYPE html> <html lang="en"> <h ...

  2. Content Security Policy 入门教程

    阮一峰文章:Content Security Policy 入门教程

  3. Content Security Policy介绍

    Content Security Policy https://content-security-policy.com/ The new Content-Security-Policy HTTP re ...

  4. 网页安全政策"(Content Security Policy,缩写 CSP)

    作者:阿里聚安全链接:https://www.zhihu.com/question/21979782/answer/122682029来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载 ...

  5. Refused to execute inline event handler because it violates the following Content Security Policy directive: "xxx". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...')

    /********************************************************************************* * Refused to exec ...

  6. options.html:1 Refused to load the script 'xxxx' because it violates the following Content Security Policy directive: "script-src 'self' blob: filesystem: chrome-extension-resource:".

    /********************************************************************************* * options.html:1 ...

  7. Content Security Policy的学习理解

    以下内容转载自 http://www.cnblogs.com/alisecurity/p/5924023.html 跨域脚本攻击 XSS 是最常见.危害最大的网页安全漏洞. 为了防止它们,要采取很多编 ...

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

    CSP简介 Content Security Policy(CSP),内容(网页)安全策略,为了缓解潜在的跨站脚本问题(XSS攻击),浏览器的扩展程序系统引入了内容安全策略(CSP)这个概念. CSP ...

  9. react route使用HashRouter和BrowserRouter的区别-Content Security Policy img-src 404(Not found)

    踩坑经历 昨天看了篇关于react-route的文章,说BrowserRouter比HashRouter好一些,react也是推荐使用BrowserRouter,毕竟自己在前端方面来说,就是个小白,别 ...

随机推荐

  1. ElementUI Tree树形控件renderContent return时报错

    问题描述: 使用Tree树形控件使用render-content渲染时return后报错或npm run dev时候报错,报错信息相同,如下: 问题分析: renderContent函数中需要使用js ...

  2. JZ-056-删除链表中重复的结点

    删除链表中重复的结点 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4-> ...

  3. JZ-033-丑数

    丑数 题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. ...

  4. Visual Studio双击打开项目而不是项目属性文件

    从VS2019版本就默认勾选了这个,每次打开都是到属性文件,这个根本用不到,点击小三角又比较麻烦,不知道为啥微软给了这个默认功能 VS2022 Preview也是,默认勾选 勾选如下即可:

  5. Springboot循环依赖实践纪实

    测试的Springboot版本: 2.6.4,禁止了循环依赖,但是可以通过application.yml开启(哈哈) @Lazy注解解决循环依赖 情况一:只有简单属性关系的循环依赖 涉及的Bean: ...

  6. laravel中{{}}和{!! !!}的区别详解

    {{}}支持转义 一段html代码只是被当成普通的字符串输出 {!! !!} 不支持转义 一段html代码可以被正常的解析 public function html(){ $address=" ...

  7. 图解|用好MySQL索引,你需要知道的一些事情

    我是蝉沐风. 这一篇文章来聊一聊如何用好MySQL索引. 为了更好地进行解释,我创建了一个存储引擎为InnoDB的表user_innodb,并批量初始化了500W+条数据.包含主键id.姓名字段(na ...

  8. k8s原来这么简单(一)核心组件与工作原理

     k8s官方文档:https://kubernetes.io/zh/docs/home/ 前提 掌握容器技术:Docker,Containerd等 K8S优势 使用简单,少量人/小团队可以轻松维护大型 ...

  9. mysql学习笔记-底层原理详解

    前言 我相信每一个程序员都避免不了和数据库打交道,其中Mysql以其轻量.开源成为当下最流行的关系型数据库.Mysql5.0以前以MyISAM作为默认存储引擎,在5.5版本以后,以InnoDB作为默认 ...

  10. 放在initramfs的ko会先加载,还是/lib/modules/下面的ko会先加载?

    如果是在switchroot时加载,用的是initramfs,在switchroot后,用的是硬盘上的,有些ko放到initramfs中,但是switchroot前不加载的话,用的还是硬盘上的,关键看 ...