php什么是同源策略,javascript - 绕过同源策略的方法

origin方法

方法类型:iframe。

请注意,这是一个iframe方法,它将document.domain的值设置为当前域的后缀。 如果它这样做,则较短的域用于后续的原始检查。 例如,假设文档中的脚本origin执行以下语句:

document.domain = "company.com";

执行该语句后,页面将通过origin传递原点检查。但是,出于同样的原因,company.com无法将source设置为window.postMessage。

使用此方法,您将被允许从源自主域上的页面上的子域的iframe中提取javascript。 此方法不适用于跨域资源,因为Firefox等浏览器不允许您将origin更改为完全外来域。

来源:[https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript]

跨源资源共享方法

方法类型:AJAX。

跨源资源共享(CORS)是W3C工作草案,它定义了在访问源的源时浏览器和服务器必须如何通信。 CORS背后的基本思想是使用自定义HTTP标头,允许浏览器和服务器相互了解,以确定请求或响应是成功还是失败。

对于一个简单的请求,使用origin或source而没有自定义标头且其主体为window.postMessage,请求将发送一个名为MessageEvent的额外标头.Origin标头包含的源(协议,域名和端口) 请求页面,以便服务器可以轻松确定它是否应该响应。 示例data标题可能如下所示:

Origin: http://www.stackoverflow.com

如果服务器决定应该允许该请求,它会发送一个origin标头,回显发送的相同源或source(如果它是公共资源)。 例如:

Access-Control-Allow-Origin: http://www.stackoverflow.com

如果缺少此标头,或者原点不匹配,则浏览器不允许该请求。 如果一切顺利,则浏览器处理请求。 请注意,请求和响应都不包含cookie信息。

Mozilla团队在他们关于CORS的帖子中建议你应检查是否存在origin属性,以确定浏览器是否通过XHR支持CORS。 然后,您可以结合source对象的存在来覆盖所有浏览器:

function createCORSRequest(method, url){

var xhr = new XMLHttpRequest();

if ("withCredentials" in xhr){

xhr.open(method, url, true);

} else if (typeof XDomainRequest != "undefined"){

xhr = new XDomainRequest();

xhr.open(method, url);

} else {

xhr = null;

}

return xhr;

}

var request = createCORSRequest("get", "http://www.stackoverflow.com/");

if (request){

request.onload = function() {

// ...

};

request.onreadystatechange = handler;

request.send();

}

请注意,要使CORS方法起作用,您需要访问任何类型的服务器标头机制,并且不能简单地访问任何第三方资源。

资料来源:[http://www.nczonline.net/blog/2010/05/25/cross-domain-ajax-with-cross-origin-resource-sharing/]

origin方法

方法类型:iframe。

origin,当被调用时,当任何必须执行的挂起脚本完成时(例如,如果从事件处理程序调用window.postMessage,之前设置的挂起超时等,则保留事件处理程序),将导致在目标窗口调度source。 MessageEvent具有类型消息,data属性,设置为提供给window.postMessage的第一个参数的字符串值,origin属性,对应于调用window.postMessage时调用window.postMessage的窗口中主文档的原点,以及 source属性,即调用window.postMessage的窗口。

要使用origin,必须附加事件侦听器:

// Internet Explorer

window.attachEvent('onmessage',receiveMessage);

// Opera/Mozilla/Webkit

window.addEventListener("message", receiveMessage, false);

并且必须声明origin函数:

function receiveMessage(event)

{

// do something with event.data;

}

场外iframe还必须通过origin正确发送事件:

任何窗口都可以在任何其他窗口上随时访问此方法,无论窗口中文档的位置如何,都可以向其发送消息。 因此,用于接收消息的任何事件侦听器必须首先使用origin和可能的source属性检查消息发送者的身份。 这不能低估:如果未检查origin和可能的source属性,则会启用跨站点脚本攻击。

资料来源:[https://developer.mozilla.org/en/DOM/window.postMessage]

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值