跨域
什么是跨域
参考这篇博客:
https://www.jianshu.com/p/f880878c1398
提取下关键词:
跨域请求就是指:当前发起请求的域与该请求指向的资源所在的域不一样。
这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。
跨域引起的安全问题:CSRF攻击
那么问题又来了
什么是CSRF攻击
梳理一下:
我们先引入一个概念浏览器的同源策略
同源策略只针对于浏览器端,浏览器一旦检测到请求的结果的域名不一致后,会堵塞请求结果。这里注意,跨域请求是可以发去的,但是请求响应response被浏览器堵塞了。
测试了一下:
请求发送到服务器并且服务器执行了相应的cgi,但是浏览器无法获取响应的数据。
那么问题又来了,如果恶意网站使用这个方法伪造一个转账请求,是不是就可以得逞了呢?答案是否定的。因为同源策略限制了不同源脚本之间的访问,也就是说恶意js脚本无法获取用户在银行网站的Cookie(网站身份验证的token会短期存放在Session中或较长期存放在Cookie中),而实际上在JS跨域请求时,浏览器既不会带跨域网站的cookie,也不会带上恶意网站的cookie。
所以说同源策略还是规避了一定的风险的,但是真的就万无一失了嘛?
答案当然是否定的
由于同源策略的限制,跨域的ajax请求不会带上cookie,然而 script / iframe / img等标签却是支持跨域的这几个标签相当危险啊,所以在请求的时候是会带上cookie的。
模拟一个“被转账”的场景
小明在一个淘宝中登录,此时cookie中有了token,同时小明又在浏览不健康网站 unhealthy.com,而这个unhealthy.com中有一个< iframe >标签的src指向淘宝的转账请求,并且如果淘宝的转账请求没有做第二次加密措施的话(当然这是不可能的),小明的钱就会被转走了
这就是CSRF攻击的典型示例
实现跨域
虽然在安全层面上同源限制是必要的,但有时同源策略会对我们的合理用途造成影响,为了避免开发的应用受到限制,有多种方式可以绕开同源策略,下面注重介绍的是经常使用的 JSONP, CORS 方法。