0. 最近发现firefox在linux下有点迷人…
一篇非常完备的博客&demo
浏览器同源策略&资源跨域
js跨域&jsonp
跨域资源共享 CORS 详解 by 在别的博客中巧遇的阮总
Springboot&Nginx实现服务端跨域的Demo
Springboot 跨域解决方案
HttpOnly Cookie
CSRF(Cross-site request forgery)跨站请求伪造
XSS (Cross Site Scripting) 跨站脚本攻击
1. 何为浏览器的同源策略
同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。
1. 为什么会出现跨域的问题(如果没有同源策略会出现哪些问题)
因为CSRF攻击,即使有了同源策略限制,但cookie是明文的。
CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的!
攻击者盗用了你的身份,以你的名义发送恶意请求。
XSS 是Web程序中最常见的漏洞。指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会在用户的浏览器上执行,从而达到攻击者的目的. 比如获取用户的Cookie,导航到恶意网站,携带木马等。
2. 绕过同源限制请求接口
jsonp
已知浏览器的跨域是对js的限制,html标签的src属性是没有限制的
https://www.cnblogs.com/kongxianghai/p/5350079.html
协议、域名、端口相同则视为同源
IP与DNS解析后的域名也互为不同源
这个也算跨域 主域名是http://crossdomain.com:9099,子域名是http://child.crossdomain.com:9099
跨域脚本调用 传递数据 动态跨域回调函数
JSONP只能发GET请求
iframe+form
post
cors
w3c提出的 跨域资源共享 Cross-origin resource sharing
http://www.ruanyifeng.com/blog/2016/04/cors.html
分为两类:
简单请求
head get post
非简单请求
head有...以外的字段
nignx
代理转发一层,转换成后端的域名
3. 绕过同源限制访问Dom节点
window.postMessage()
HTML5的一个接口,专注实现不同窗口不同页面的跨域通讯。
document.domain
子主域名的情况
canvas
详见上面的链接
4. Http协议提供的一些cookie的安全选项
HttpOnly是加在cookies上的一个标识,用于告诉浏览器不要向客户端脚本(document.cookie或其他)暴露cookie。
另外还有一个安全标识可以强制浏览器发送cookie的时候采用安全通道,比如HTTPS,可以防止被监听。尤其是在HTTPS连接被一些工具(比如SSLStrip等)降级到HTTP。
5. 解决方法
5.1 后端解决方案
5.1 springboot注解方式
@CrossOrigin
支持方法(某个请求)、控制器(一系列请求)粒度
5.2 从spring mvc的角度入手
支持全局粒度
注入自定义的java config类
,并extends WebMvcConfigureAdapter
,并重写addCorsMapping()
5.3 拦截响应内容
全局粒度的
对response对象加cors相关的header