CSP 内容安全策略(Content Security Policy),用于检测并削弱某些特定类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击等。CSP通过指定有效域(或者说白名单)使开发者有能力减少或消除XSS攻击所依懒的载体(XSS 攻击利用了浏览器对于从服务器所获取的内容的信任。恶意脚本在受害者的浏览器中得以运行,因为浏览器信任其内容来源,即使有的时候这些脚本并非来自于它本该来的地方)。另外 CSP也可以限制只使用HTTPS的内容 。mdn上的CSP 、CSP策略列表 。
通过mate方式使用CSP 1 <meta http-equiv ="Content-Security-Policy" content ="default-src 'self'; img-src https://*; child-src 'none';" >
1 Content-Security-Policy: default-src https://onlinebanking.jumbobank.com
CSP测试模式 CSP是个大杀器,贸然使用可能会导致页面不可用或者其他问题。使用测试模式只报告错误不阻止内容,收集受影响的页面不失是一个比较好的解决方案。详见
HPKP Http公钥锁定(HTTP Public Key Pinning),通过向header头添加标识 Public-Key-Pins 通知浏览器将公钥缓存在浏览器端一段时间。若期间内发生了中间人攻击,浏览器发现伪装的证书和本地缓存的证书不匹配,则发出警告,警示用户。
需要注意的是该缓存是强缓存,缓存期间如果服务器更换了密钥,网站将无法正常访问。现有的解决方案是在配置 Public-Key-Pins 的时候 配置一个备用的公钥
启用HPKP 详见 1 Public-Key-Pins: pin-sha256="base64=="; max-age=expireTime [; includeSubDomains][; report-uri="reportURI"]
HSTS HTTP严格安全传输(HTTP Strict Transport Security ), 通过向header头添加标识 Strict-Transport-Security通知浏览器在未来的一段时间内强制使用HTTPS访问服务器。需要注意的是,如果浏览器没有使用HTTPS访问过服务器或者缓存已过期,标识 Strict-Transport-Security 将会被忽略。 这是因为攻击者可能会拦截HTTP连接并注入标头或将其删除。
Google维护着一个HSTS预加载服务 。通过遵循指南并成功提交您的域名,浏览器将永远不会使用不安全的连接连接到您的域。虽然该服务由Google托管,但所有浏览器都声明有意使用(或实际开始使用)预加载列表。但是,它不是HSTS规范的一部分,不应被视为官方规范。
现在,你的服务器总是会以HTTPS访问了。
使用HSTS 详见 1 Strict-Transport-Security: max-age=31536000; includeSubDomains
Cookie 安全 一个HTTP cookie的(网络Cookie,浏览器cookie)是一小片数据的一个服务器发送到用户的网络浏览器。浏览器可以存储它并将其与下一个请求一起发送回同一服务器。通常情况下,它用于判断两个请求是否来自同一个浏览器 - 例如,保持用户登录。它记住无状态 HTTP协议的有状态信息。
基于这个特性,Cookie可以说是攻击者们最惦记着的目标了。
HttpOnly 给Header头加上 HttpOnly 标识,可以很好的防止跨站点脚本(XSS)攻击。某项 Cookie 添加了 HttpOnly 之后,Javascript 无法通过 Document.cookie 访问到它,它们只会被发送到服务器。 可以通过chrome dev tools 的Application选项卡下的Cookies 列表看到是否是HttpOnly
Secure 给Header头加上 Secure 标识,cookie仅会在使用了https协议的时候才会被发送回服务器。 可以通过chrome dev tools 的Application选项卡下的Cookies 列表看到是否是 Secure
举个例子 1 Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
X-Content-Type-Options 给Header头加上 X-Content-Type-Options 标识,可以阻止内容:
请求的类型为 style 并且MIME类型不是 text/css
请求的类型为 script 并且MIME类型不是JavaScript MIME类型
X-Frame-Options 给Header头加上 X-Content-Type-Options 标识,可以指示允许一个页面可否在 ,
X-Frame-Options 有三个值:详见
DENY 表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许。
SAMEORIGIN 表示该页面可以在相同域名页面的 frame 中展示。
ALLOW-FROM uri 表示该页面可以在指定来源的 frame 中展示。
X-XSS-Protection(这是一个过时标识) HTTP X-XSS-Protection 响应头是Internet Explorer,Chrome和Safari的一个功能,当检测到跨站脚本攻击 (XSS)时,浏览器将停止加载页面。当网站实施一个强大的Content-Security-Policy来禁用内联的JavaScript (‘unsafe-inline’)时, 他们仍然可以为尚不支持 CSP 的旧版浏览器的用户提供保护。
X-XSS-Protection 支持以下值:
0 禁止XSS过滤。
1 启用XSS过滤(通常浏览器是默认的)。 如果检测到跨站脚本攻击,浏览器将清除页面(删除不安全的部分)。
1;mode=block 启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。
1; report=<reporting-URI> (Chromium only 启用XSS过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP report-uri指令的功能发送违规报告。
点击劫持攻击 点击劫持是一种恶意技术,它诱使用户点击与用户感知的内容不同的内容,从而可能泄露机密信息或允许其他人控制其计算机同时点击看似无害的对象。
举个例子,小王点击了某盗版影视网站的播放按钮,实际上却是偷偷的给淘宝购物车下了单。
CSRF/XSRF 跨站请求伪造攻击 跨站请求伪造(Cross-site_request_forgery)是一种欺骗受害者提交恶意请求的攻击。它继承了受害者的身份和特权,代表受害者履行不受欢迎的职能。对于大多数站点,浏览器请求自动包括与站点关联的任何凭据。
CSRF攻击的基本原理是:
你登录了某网站,如bilibili.
在你访问恶意网站时,恶意网站针对性的向bilibili发起请求,比如关注我(bilibili已作了csrf防御)。
此时,虽然恶意网站看不到bilibili的cookie,但是cookie会被附加到请求Header头里。就成功欺骗了服务器用你的登录身份关注了我
你看到之篇文章的时候,你的bilibili已经被偷偷的登出了。1 <img src="https://account.bilibili.com/login?act=exit">
或者偷偷修改了一些信息。(bilibili作了csrf防御,所以以下行为不会生效。)1 2 <iframe name ="badboy" display ="none" src ="https://janusdemo.3mm.me/bilibili_iframe.html" > </iframe >
1 2 3 4 5 6 7 8 9 10 11 12 <body> <form method="POST" id ="bilibili" name="transfer" action="https://api.bilibili.com/x/member/web/update"> <input type="hidden" name="uname" value="你们"> <input type="hidden" name="usersign" value="偷偷的来"> <input type="hidden" name="sex" value="保密"> <input type="hidden" name="birthday" value="1900-1-1"> <input type="hidden" name="csrf" value="024e772a01f7931072dd671808e2ff52"> </form> <script> document.forms.bilibili.submit() </script> </body>
如何防御CSRF
上OPT或者验证码,由于csrf攻击者拿不到验证码,发起的请求会被拒绝,但是用户体验极差。
使用随机令牌,用户登录时向用户推送一个csrf随机码,这个码随着用户登录过期而过期,在每一次请求的时候偷偷带上这个码。每个请求服务器都会验证 个码,验证失败拒绝请求。由于csrf无法读取用户cookie,所以这个方式是目前主流的防csrf攻击的方案
refer识别, 限制白名单之外的来源。
XSS 跨站脚本攻击Cross-site scripting是一种安全漏洞,攻击者可以利用这种漏洞在网站上注入恶意的客户端代码。 简单来说就是攻击者利用各种方式向你的网站注入非法脚本,以达到网站不可用、盗取信息、广告注入等目的。详见 )
常见的攻击方式
网络运营商向非https网站注入脚本,往往大多都是广告 ,常常也会预期外的对网站造成破坏,使得网站不可用。
攻击者利用网站内部漏洞,比如src、href、Event、form表单等提交非法脚本完成攻击。
防御方式
升级HTTPS,HTTPS可以有效的防止数据被修改
使用 HttpOnly、CSP和上述其他安全机制。
后端对前台提交的数据进行清理,比如库
前端对不受信任的数据进行html、JavaScript、css转义
不要在 css、script、html中插入不受信任的数据。
对URL进行转义
不要使用外链。或者安全白名单之外的域名。