规避同一原产地政策的方法

已锁定。这个问题及其答案被锁定,因为这个问题离题,但具有历史意义。它目前不接受新的答案或互动。

同一原产地政策

我想制作一个关于HTML/JS同源策略的社区wiki,希望能帮助搜索此主题的任何人。这是SO上搜索最多的主题之一,并且没有统一的wiki,因此我决定:)

同一原产地政策可防止
从一个数据库加载的文档或脚本
起源于获得或设置
来自另一个文档的文档属性
起源这项政策一直沿用至今
回到Netscape Navigator 2.0

您最喜欢采用哪些方法来执行相同的原产地政策

请保持详细的例子,最好也链接您的来源

document.domain方法

  • 方法类型:iframe

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

document.domain=“company.com”;

执行该语句后,页面将通过http://company.com/dir/page.html。然而,根据同样的推理,company.com无法将document.domain设置为othercompany.com

使用此方法,您可以从源于主域的页面上的子域上的iframe执行javascript。此方法不适用于跨域资源,因为Firefox等浏览器不允许您将document.domain更改为完全陌生的域

资料来源:https://developer.mozilla.org/en/Same_origin_policy_for_JavaScript

跨源资源共享方法

  • 方法类型:AJAX

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

对于一个简单的请求,使用GETPOST且没有自定义标题且其正文为text/plain,请求将与一个名为Origin的额外标题一起发送。Origin标头包含请求页面的来源(协议、域名和端口),以便服务器可以轻松确定是否应提供响应。示例Origin标题可能如下所示:

原点:http://www.stackoverflow.com

如果服务器决定应该允许该请求,它将发送一个访问控制允许源头,回显已发送的相同源或*(如果是公共资源)。例如:

访问控制允许原点:http://www.stackoverflow.com

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

Mozilla团队在关于CORS的帖子中建议,您应该检查with credentials属性是否存在,以确定浏览器是否通过XHR支持CORS。然后,您可以与XDomainRequest对象结合使用,以覆盖所有浏览器:

函数createCORSRequest(方法,url){
var xhr=new XMLHttpRequest();
如果(xhr中的“带凭证”){
open(方法、url、true);
}else if(XDomainRequest的类型!=“未定义”){
xhr=新的XDomainRequest();
open(方法,url);
}否则{
xhr=null;
}
返回xhr;
}
var请求=createCORSRequest(“获取”http://www.stackoverflow.com/");
如果(请求){
request.onload=函数(){
// ...
};
request.onreadystatechange=处理程序;
request.send();
}

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

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

window.postMessage方法

  • 方法类型:iframe

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

要使用window.postMessage,必须附加事件侦听器:

//Internet Explorer
window.attachEvent('onmessage',receiveMessage);
//Opera/Mozilla/Webkit
window.addEventListener(“消息”,receiveMessage,false);

并且必须声明receiveMessage函数:

函数接收消息(事件)
{
//使用event.data做一些事情;
}

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

<脚本>window.parent.postMessage('foo','*')&lt/脚本>

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

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

发表评论