摘要: 本篇文章是总结工作中遇到的安全问题
正文:
API 网关的安全
XSRF/CSRF
跨站请求伪造(Cross-site request forgery)是一种挟制用户在当前已登录的web程序上执行非本意的操作的攻击方法,简单来说就是你在浏览器打开了两个页面,其中一个页面通过窃取另一个页面的cookie来发送伪造请求
Example
某一家银行转账操作的url地址为:http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName
藏身于恶意网站的某代码片段:<img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">
若账户人员为Alice的用户访问了恶意网站,其登录信息尚未过期,就会丢失1000资金
CSRF攻击并不是直接获取用户账户控制权,而是欺骗用户浏览器,让其已用户的名义执行操作
防御措施
HTTP
头Referer
字段,这个字段用以标明请求来源于哪个地址,看其url
是否与要请求地址位于同一域名下- 添加校验
Token
,恶意网站的请求不带Token无法通过校验
XSS
跨站脚本(Cross-site scripting)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。
防御措施
- 过滤特殊字符(转义)
- 使用浏览器自带的xss-filter
- X-XSS-Protection
- CSP(Content Security Policy)
- 如限制script src Content-Security-Policy: script-src ‘self’
- frame-ancestors 限制了当前页面可以被哪些页面以iframe,frame,object等方式加载
- Github的CSP参数 123456789101112Content-Security-Policy: default-src 'none'; base-uri 'self';block-all-mixed-content;connect-src 'self' uploads.github.com status.github.com collector.githubapp.com api.github.com www.google-analytics.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com wss://live.github.com;font-src assets-cdn.github.com;form-action 'self' github.com gist.github.com;frame-ancestors 'none';frame-src render.githubusercontent.com;img-src 'self' data: assets-cdn.github.com identicons.github.com collector.githubapp.com github-cloud.s3.amazonaws.com *.githubusercontent.com; manifest-src 'self';media-src 'none';script-src assets-cdn.github.com;style-src 'unsafe-inline' assets-cdn.github.com
- X-Frame-Options:SAMEORIGIN 这个页面只允许同源页面加载
- Http-Only 保护cookie
JWT的安全
JWT一种基于JSON的、用于在网络上声明某种主张的令牌,由三部分组成,头部、消息体与签名。
前端将JWT通过HTTP Header发送给服务端可以有效防护CSRF,但是服务端既然无状态,Token在客户端存储位置就是一个问题
存放位置
- 存在Cookie,要使用Http-Only 保护cookie
- 存在Local Storage 无法防止XSS LocalStorage 的API通过JavaScript提供的,攻击者可以通过XSS攻击窃取信息,如Token等
12345 | if(localStorage.length){ for(i in localStorage) { console.log(localStorage.getItem(i)); }} |
---|