栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JavaScriptWays to circumvent the same-origin policy

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaScriptWays to circumvent the same-origin policy

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
改为完全异类的域。

跨域资源共享方法

  • 方法类型: AJAX

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

对于一个简单的请求,该请求使用

GET
POST
不使用任何自定义标头,并且其主体为
text/plain
,则发送一个带有额外标头的请求
Origin
。Origin头包含请求页面的来源(协议,域名和端口),以便服务器可以轻松确定是否应提供响应。
Origin
标头示例可能如下所示:

Origin: http://www.stackoverflow.com

如果服务器决定应允许该请求,则它将发送

Access-Control-Allow-Origin
标头,以回显与发送的原始源相同的消息,或者
*
它是公共资源。例如:

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

如果缺少此标头,或者起源不匹配,则浏览器将拒绝该请求。如果一切顺利,则浏览器将处理请求。请注意,请求和响应均不包含cookie信息。

建议您应检查该

withCredentials

属性是否存在,以确定浏览器是否通过XHR支持CORS。然后,您可以结合
XDomainRequest
对象的存在来覆盖所有浏览器:

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方法起作用,您需要有权访问任何类型的服务器头机制,并且不能简单地访问任何第三方资源。

window.postMessage
方法

  • 方法类型: iframe

window.postMessage
,当被调用时,导致
MessageEvent
在必须执行的任何待执行脚本完成时(例如,如果
window.postMessage
从事件处理程序调用了剩余的事件处理程序,先前设置的待处理超时等),在目标窗口处调度a
。的
MessageEvent
具有类型消息,
data
其被设置为提供到所述第一参数的字符串值属性
window.postMessage
,一个
origin
对应于窗口调用主文档的原点属性
window.postMessage
在时间
window.postMessage
被调用,并且一个
source
属性,该属性是窗口从它
window.postMessage
被调用。

要使用

window.postMessage
,必须附加事件监听器:

    // Internet Explorer    window.attachEvent('onmessage',receiveMessage);    // Opera/Mozilla/Webkit    window.addEventListener("message", receiveMessage, false);

并且

receiveMessage
必须声明一个函数:

function receiveMessage(event){    // do something with event.data;}

异地iframe还必须通过

postMessage
以下方式正确发送事件:

<script>window.parent.postMessage('foo','*')</script>

无论文档在窗口中的位置如何,任何窗口都可以随时在任何其他窗口上访问此方法,以向其发送消息。因此,用于接收消息的任何事件侦听器都必须首先使用原始属性和可能的​​源属性检查消息发送者的身份。这不能低估:
无法检查

origin
和可能的
source
属性将启用跨站点脚本攻击。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/402552.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号