CORS
什么是跨域请求? 跨域就是向与当前不同域请求资源。
为什么会出现跨域?因为浏览器的同源策略,即浏览器必须保证只有 协议+端口+域名 一模一样才允许发 AJAX 请求。同源策略的本质是为了保护我们的上网安全,比如CSRF攻击等等。
为了突破同源策略,才有一系列的解决方案。
CORS: 跨域资源共享,CORS是一种 AJAX 跨域请求资源的方式。其可以理解为一种规范,CORS 背后的基本思想,就是使用自定义的 HTTP 头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功,还是应该失败。
浏览器将CORS请求分成两类:简单请求和非简单请求。
简单的理解,简单请求就是请求方法是GET、POST、HEAD,请求头部就几个头部字段,这听着就很简单,于是这种简单请求在请求中需要附加一个额外的 Origin 头部,其中包含请求页面的源信息(协议、域名和端口),以便服务器根据这个头部信息来决定是否给予响应。如果服务器认为这个请求可以接受,就在 Access-Control-Allow-Origin 头部中回发相同的源信息(如果是公共资源,可以回发 * )。
非简单请求就是在简单请求的基础上多了一次预先的请求,感觉类似TLS协议第一次握手的时候商量一下我们后面的传输采用什么协议什么加密方法什么的,这个非简单请求也是,请求带过去的时候会带一些东西。
就是问候一下自己这些方法和头部可以被允许吗?
然后服务器会返回一个数据
告诉浏览器自己支持啥方法,啥头部,这也是算是服务器同意了说你这个域的这种请求我可以同意,但是如果说返回的字段中没有Access-Control之类的字段,说明这个请求被否决了。
然后后续的请求就和简单请求一样了。
CSRF
这个中文叫做跨站请求伪造,直白点的讲解这个过程就是这样的: 我登陆了一个网站A,获取了这个网站给我的cookie存储在了我的本地浏览器,随后我好奇点了一个图片进入到了另一个网站B,但是这个时候网站A收到了我发的请求...幸好这个网站A不会银行,不然就直接完犊子了。
这个就是csrf,歹徒假装我去做了一些不好的事情,所以在网上不要乱点东西。
这个就是因为我本地保存着先前网站的cookie,然后歹徒在B网站植入了一些脚本,当我点击的时候触发点击事件发送了一些请求,最关键的是当发请求的时候该域下的所有cookie也会被带过去,于是网站A以为就是我,然后就炸了,这个就叫伪造!
所以必要的防御手段就是要么设置Http头部的referer字段,这个字段用以标明请求来源于哪个地址,如果是歹徒的脚本,那么这个字段就是歹徒的那个网站,正常情况下这个字段的值应当和网站A在同一个域下对吧,所以这个可以处理这个问题,但是有些浏览器有bug可以修改referer,所以并不是非常的安全。
另一个方法就是说给一个随机数(Token),如果要访问敏感数据请求时,服务器会要求用户浏览器提供不保存在cookie中,并且攻击者无法伪造的数据作为校验,那么攻击者就无法再运行CSRF攻击。这种数据通常是窗体中的一个数据项。服务器将其生成并附加在窗体中,其内容是一个伪随机数。当客户端通过窗体提交请求时,这个伪随机数也一并提交上去以供校验。正常的访问时,客户端浏览器能够正确得到并传回这个伪随机数,而通过CSRF传来的欺骗性攻击中,攻击者无从事先得知这个伪随机数的值,服务端就会因为校验token的值为空或者错误,拒绝这个可疑请求。