同源策略以及绕过此限制的方法

一、同源策略

1、何为同源?

所谓"同源"指的两个网页url的三个部分是相同的:

http://www.example.com80/dir/page.html

  • 协议相同
  • 域名相同
  • 端口相同

2、同源策略

同源策略是Web应用程序安全模型中的一个重要概念,它由 Netscape 公司在1995年引入浏览器。该策略最初是为保护DOM的访问而设计的,Web浏览器允许第一个Web页面中包含的脚本访问第二个Web页面中的数据,但前提是两个Web页面具有相同的origin。后来进行了扩展,此策略可防止一个页面上的恶意脚本通过该页面的DOM访问另一个网页上的敏感数据。这一机制对于广泛依赖HTTP cookie来维护经过身份验证的用户会话的现代Web应用程序具有特别的意义,因为服务器基于HTTP cookie信息来显示敏感信息或采取状态更改操作。必须在客户端保持无关站点提供的内容之间的严格分离,以防止数据机密性或完整性丢失。

同源策略主要应用于从脚本访问数据;通过相应的HTML标记嵌入跨源的资源,如图像、CSS和脚本不受限制

3、实现

因为它是一个重要的安全基石,所有现代浏览器都实现某种形式的同源策略,这些策略不需要与精确的规范相匹配,但通常被扩展为与其他Web技术(如Microsoft Silverlight、Adobe Flash或Adobe Acrobat或M)定义大致兼容的安全边界。

4、同源策略的限制

(1) Cookie、LocalStorage 和 IndexDB 无法读取

(2) DOM 无法获得

(3) AJAX 请求不能发送

 

二、绕过同源策略限制的方法

1、document.domain属性

Cookie 是服务器写入浏览器的一小段信息,只有同源的网页才能共享。但是,两个网页一级域名相同,只是二级域名不同,浏览器允许通过设置document.domain共享 Cookie。

1.1、通过JS设置document.domain属性:

<script type="text/javascript">
document.domain = 'example.com';
</script>

1.2、服务器也可以在设置Cookie的时候,指定Cookie的所属域名为一级域名,比如.example.com。
Set-Cookie: key=value; domain=.example.com; path=/
这样的话,二级域名和三级域名不用做任何设置,都可以读取这个Cookie。

 

2、片段识别符(fragment identifier)

片段标识符(fragment identifier)指的是,URL的#号后面的部分,比如http://example.com/x.html#fragment#fragment

当fragment变化的时候,会触发window.onhashchange事件,可以通过修改片段标识符的值,来在两个页面之间传递数据

父窗口可以把信息,写入子窗口的片段标识符。

var src = originURL + '#' + data;
document.getElementById('myIFrame').src = src;
子窗口通过监听hashchange事件得到通知。

window.onhashchange = checkMessage;

function checkMessage() {
  var message = window.location.hash;
  // ...
}
同样的,子窗口也可以改变父窗口的片段标识符:
parent.location.href= target + "#" + hash;

3、window.name
4、跨文档通信API(Cross-document messaging)

5、JSONP

6、CORS(Cross-Origin Resource Sharing)

7、WebSockets

 

三、JSONP和CORS两种跨域方式的对比:

3.1、JSONP

  JSONP是利用浏览器对script的资源引用没有同源限制,通过动态插入一个script标签,当资源加载到页面后会立即执行的原理实现跨域的。JSONP是一种非正式传输协议,该协议的一个要点就是允许用户传递一个callback或者开始就定义一个回调方法,参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
  JSONP只支持GET请求而不支持POST等其它类型的HTTP请求,它只支持跨域HTTP请求这种情况,不能解决不同域的两个页面之间如何进行JavaScript调用的问题,JSONP的优势在于支持老式浏览器,弊端也比较明显:需要客户端和服务端定制进行开发,服务端返回的数据不能是标准的Json数据,而是callback包裹的数据。

3.2、CORS

  CORS是现代浏览器支持跨域资源请求的一种方式,当使用XMLHttpRequest发送请求时,浏览器发现该请求不符合同源策略,会给该请求加一个请求头:Origin,后台进行一系列处理,如果确定接受请求则在返回结果中加入一个响应头:Access-Control-Allow-Origin;浏览器判断该相应头中是否包含Origin的值,如果有则浏览器会处理响应,我们就可以拿到响应数据,如果不包含浏览器直接驳回,这时我们无法拿到响应数据。
  CORS支持所有的浏览器请求类型,承载的请求数据量更大,开放更简洁,服务端只需要将处理后的数据直接返回,不需要再特殊处理。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用axios发送跨域请求需要在请求头中添加`Access-Control-Allow-Origin`来允许跨域访问,但是由于这个请求头是服务器端返回的,客户端无法直接添加,所以需要通过其他方式来绕过同源策略限制。 一种常见的方法是使用JSONP(JSON with Padding)技术。JSONP是一种跨域数据请求的解决方案,它利用了script标签不受同源策略限制的特性,将需要获取的数据包装在一个回调函数中,然后通过script标签引入远程脚本,从而获取数据。 以下是一个使用axios和JSONP的示例代码: ```js import axios from 'axios'; axios.jsonp('https://h5vv.video.qq.com/getinfo', { params: { vids: vid, platform: 101001, charge: 0, otype: 'json', defn: 'sd', callback: 'jsonpCallback' } }) .then(response => { console.log(response.data); }) .catch(error => { console.log(error); }); function jsonpCallback(data) { console.log(data); } ``` 在上面的代码中,我们使用axios.jsonp()方法来发起跨域请求,并将请求的URL和参数作为参数传递给该方法。在参数中,我们需要指定一个callback参数来指定回调函数的名称,该回调函数的名称需要在服务端进行处理后返回给客户端。 在服务端处理请求时,需要根据callback参数的值将响应数据包装在一个函数中返回给客户端。例如,在Node.js中可以使用如下代码实现: ```js const callbackName = req.query.callback; const responseData = { /* 响应数据 */ }; const responseString = `${callbackName}(${JSON.stringify(responseData)})`; res.send(responseString); ``` 在客户端,我们需要定义一个与服务端返回的回调函数名称相同的函数(如上述代码中的jsonpCallback函数),该函数会在服务端返回的数据中被调用,并将响应数据作为参数传递给它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值