同源策略
同源策略:一种约定,时浏览器最核心的安全功能,若缺少同源策略,浏览器功能将受到影响。可以说web是在同源策略基础上的,浏览器只是针对同源策略的一种实现。
不同源的客户端脚本在未授权的请求下,不能读写对方的资源像:DOM/COOKIE/SESSION
CORS
- cors(原理与csrf相似)
跨域资源共享,是可以通过在HTTP中增加字段来告诉浏览器,那些不同来源的服务器是有权限来访问本站资源的,当不同域的请求发生时,就出现了跨域的现象。
cors出现是为了弥补JOSNP等跨域常见的技术缺陷而提出的安全方面的跨域方案。允许浏览器像跨域服务器发出xmlhttprequest请求,从而克服Ajax只能同源使用的限制。
cors需要浏览器和服务器同时支持,相比较JSONP更加复杂,但是一般目前的浏览器都是需要进行相应配置,其通信过程都是浏览器自动完成,对于开发人员来说,与Ajax没区别,只会在发送跨域请求时在HTTP请求头加入一些字段验证:
关键字:
ACCESS-CONTROL-ALLOW-ORIGIN:指定那些域访问资源;若a访问b的资源,可以用此头来授权
ACCESS-CONTROL-ALLOW-CREDENTIALS:指定浏览器是否将使用请求发送cookie。只有allow-credentials标头设置为true时,才会发送cookie;
ACCESS-CONTROL-ALLOW-METHODS:指定可以使用的请求方式来访问资源。
- 为什么要进行跨域
跨域本质就是绕过同源策略的严格限制,安全与实用往往有时候会有一定的矛盾性,开发人员更注重的是功能的开发使用,例如有时候同二级域名下的不同三级域名需要进行一些信息数据传输时,共享一些资源时,同源策略将其限制,但是又要实现该功能,此时就诞生了一些跨越请求的技术。
- 跨域的应用场景:
比如后端开发完一部分业务代码后,提供接口给前端用,在前后端分离的模式下,前后端的域名是不一致的,此时就会发生跨域访问的问题。
程序员在本地做开发,本地的文件夹并不是在一个域下面,当一个文件需要发送ajax请求,请求另外一个页面的内容的时候,就会跨域。
电商网站想通过用户浏览器加载第三方快递网站的物流信息。
子站域名希望调用主站域名的用户资料接口,并将数据显示出来。
- 常见的跨域的标签
<script src= ></script>
<img src= >
<video src= ></video>
<audio src= > </audio>
<embed src=>
<iframe src= ><iframe>
<link rel="stylesheet"href=>
<applet code=></applet>
<object data= ></object>
JSONP
JSON是一种基于文本的轻量级的数据交换格式。
JSONP是一种协议,准确的说,它是JSON的一种使用模式,因为浏览器有同源策略的限制,像test1.com和test2.com之间是无法通信的,但是调用js文件,却不受同源的影响,并且src属性引入的文件都不受同源的限制,这也是同源策略为了方便留下的一个后门,所以要想把远程数据加载到web页面中,就得把复杂数据转换为js文件,注意JSON数据是被js(JS不受同源策略的影响)原生支持的,这样就可以把复杂数据转换成轻巧的json数据,但是注意JSONP只支持GET方式。
- 组成
JsoNP的组成
JSONP两部分组成:回调函数和里面的数据。
回调函数是当响应到来时,应该在页面中调用的函数,一般是在发送过去的请求中指定。
JSONP跨域原理
利用< script>标签没有跨域限制的漏洞,网页可以从其他来源域动态获取JSON数据,JSONP跨域请求一定需要对方的服务器支持才可以。
通俗的讲,JSONP原理就是动态插入带有跨域url的< script>标签,把我们需要的json数据作为参数传入,通过一些逻辑把数据显示在页面上。
- 实现流程
服务端必须支持jsonp,且拥有jso面p跨域接口(前提)
浏览器客户端声明一个回调函数,其函数名作为参数值,要传递给跨域请求数据的服务器,函数形参为要获取到的返回目标数据
创建一个< script>标签,把跨域的API数据接口加载到src属性,并且在这个地址向服务器传递该回调函数名
服务器会将数据返回到浏览器客户端,此时客户端会调用回调函数,对返回的数据进行处理
- 安全漏洞(JSONP)
对于输入的callback函数名过滤不严格,导致输入的数据直接输出到前端造成XSS
JSONP劫持漏洞,由于对于来源域没有严格限制,因此来源于不安全的域的请求也会被响应