Chrome 扩展已经引入了 CSP,通过 manifest.json 中的 content_security_policy 字段来定义 。一些现代浏览器也支持通过响应头来定义 CSP 。下面我们主要介绍如何通过响应头来使用 CSP,Chrome 扩展中 CSP 的使用可以参考 Chrome 官方文档 。
# HTTP 响应头Content-Security-Policy允许站点管理者控制用户代理能够为指定的页面加载哪些资源 。# 除了少数例外情况,设置的政策主要涉及指定服务器的源和脚本结束点 。# Content-Security-Policy响应头的缺失使得目标URL更易遭受跨站脚本攻击 。
浏览器兼容性# 早期的 Chrome 是通过 X-WebKit-CSP 响应头来支持 CSP 的,而 firefox 和 IE 则支持 X-Content-Security-Policy,# Chrome25 和 Firefox23 开始支持标准的 Content-Security-Policy
如何使用# 要使用 CSP,只需要服务端输出类似这样的响应头就行了:Content-Security-Policy: default-src 'self'# default-src 是 CSP 指令,多个指令之间用英文分号分割;'self' 是指令值,多个指令值用英文空格分割 。目前,有这些 CSP 指令:
文章插图
文章插图
从上面的介绍可以看到,CSP 协议可以控制的内容非常多 。而且如果不特别指定 'unsafe-inline' 时,页面上所有 inline 样式和脚本都不会执行;不特别指定 'unsafe-eval',页面上不允许使用 new Function,setTimeout,eval 等方式执行动态代码 。在限制了页面资源来源之后,被 XSS 的风险确实小不少 。StrictTransportSecurity响应头什么是StrictTransportSecurity?
当然,仅仅依靠 CSP 来防范 XSS 是远远不够的,不支持全部浏览器是它的硬伤 。不过,鉴于低廉的开发成本,加上也没什么坏处 。
一个网站接受一个HTTP的请求,然后跳转到HTTPS,用户可能在开始跳转前,通过没有加密的方式和服务器对话,比如,用户输入http://foo.com或者直接foo.com 。这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息 。网站通过HTTP Strict Transport Security通知浏览器,这个网站禁止使用HTTP方式加载,浏览器应该自动把所有尝试使用HTTP的请求自动替换为HTTPS请求 。为什么要开启
有的网站开启了https,但为了照顾用户的使用体验(因为用户总是很赖的,一般不会主动键入https,而是直接输入域名, 直接输入域名访问,默认就是http访问)同时也支持http访问,当用户http访问的时候,就会返回给用户一个302重定向,重定向到https的地址,然后后续的访问都使用https传输,这种通信模式看起来貌似没有问题,但细致分析,就会发现种通信模式也存在一个风险,那就是这个302重定向可能会被劫持篡改,如果被改成一个恶意的或者钓鱼的https站点,然后,你懂得,一旦落入钓鱼站点,数据还有安全可言吗?
对于篡改302的攻击,建议服务器开启HTTP Strict Transport Security功能,这个功能的含义是:
当用户已经安全的登录开启过htst功能的网站 (支持hsts功能的站点会在响应头中插入:Strict-Transport-Security) 之后,支持htst的浏览器(比如chrome. firefox)会自动将这个域名加入到HSTS列表,下次即使用户使用http访问这个网站,支持htst功能的浏览器就会自动发送https请求(前提是用户没有清空缓存,如果清空了缓存第一次访问还是明文,后续浏览器接收到服务器响应头中的Strict-Transport-Security,就会把域名加入到hsts缓存中,然后才会在发送请求前将http内部转换成https),而不是先发送http,然后重定向到https,这样就能避免中途的302重定向URL被篡改 。进一步提高通信的安全性 。
上面是我自己的理解,下面是owasp中文站点关于hsts的描述:
HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接 。服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段 。非加密传输时设置的HSTS字段无效 。
比如,https://example.com/ 的响应头含有Strict-Transport-Security: max-age=31536000; includeSubDomains 。这意味着两点:
在接下来的一年(即31536000秒)中,浏览器只要向example.com或其子域名发送HTTP请求时,必须采用HTTPS来发起连接 。比如,用户点击超链接或在地址栏输入 http://www.example.com/,浏览器应当自动将 http 转写成 https,然后直接向 https://www.example.com/ 发送请求 。
推荐阅读
- 电脑硬件配置够但玩游戏就是不流畅,这问题可能出在哪里呢?
- 华为防火墙配置上网行为管理,禁止上网,只允许邮件、微信和钉钉
- 自动化测试之读取配置文件
- Docker 安装 Nginx
- Nignx的安装和使用
- 负载均衡解析与Nginx实战
- 女人味|外国男生晒出模仿女生的各种摆拍,画风充满“女人味”,辣眼睛
- 氯化钠注射液起什么作用?
- 华为交换机DHCP配置方法,了解一下?
- 小白必备 头条创作23天,头条收益以及各种数据参考老司机忽略