同源策略
我想制作有关HTML / JS 同源策略的社区Wiki,以希望能帮助任何人搜索此主题。这是关于SO的最热门搜索主题之一,并且没有统一的Wiki,所以我在这里:)
相同的来源策略可防止从一个来源加载的文档或脚本从另一个来源获取或设置文档的属性。该策略可以追溯到Netscape Navigator 2.0。
您采用哪些最喜欢的方式处理同源策略?
请保持详细示例,并最好也链接您的资源。
我想制作有关HTML / JS 同源策略的社区Wiki,以希望能帮助任何人搜索此主题。这是关于SO的最热门搜索主题之一,并且没有统一的Wiki,所以我在这里:)
相同的来源策略可防止从一个来源加载的文档或脚本从另一个来源获取或设置文档的属性。该策略可以追溯到Netscape Navigator 2.0。
请保持详细示例,并最好也链接您的资源。
以下是对同源策略的一些变通方法和解释:
Thiru的博客-浏览器同源策略的变通方法
就个人而言,这window.postMessage
是我为现代浏览器找到的最可靠的方法。您确实需要做更多的工作,以确保您不会对XSS攻击开放,但这是一个合理的权衡。
还有一些流行的Javascript工具包的插件,它们window.postMessage
使用上述其他方法提供了与旧版浏览器相似的功能。
好吧,我在PHP中使用curl来避免这种情况。我有一个在端口82中运行的Web服务。
<?php
$curl = curl_init();
$timeout = 30;
$ret = "";
$url="http://localhost:82/put_val?val=".$_GET["val"];
curl_setopt ($curl, CURLOPT_URL, $url);
curl_setopt ($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($curl, CURLOPT_MAXREDIRS, 20);
curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5");
curl_setopt ($curl, CURLOPT_CONNECTTIMEOUT, $timeout);
$text = curl_exec($curl);
echo $text;
?>
这是对PHP文件进行调用的JavaScript
function getdata(obj1, obj2) {
var xmlhttp;
if (window.XMLHttpRequest)
xmlhttp=new XMLHttpRequest();
else
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("txtHint").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","phpURLFile.php?eqp="+obj1+"&val="+obj2,true);
xmlhttp.send();
}
我的HTML在端口80上的WAMP上运行。因此,我们绕过了相同的来源策略:-)
该JSONP想到:
JSONP或“带填充的JSON”是对基本JSON数据格式的补充,这种使用模式允许页面请求并更有意义地使用来自主服务器以外的服务器的JSON。JSONP是最新方法“跨域资源共享”的替代方法。
我无法为这张图片赢得赞誉,但它与我对此主题的所有知识相匹配,并且同时具有幽默感。
我使用JSONP。
基本上,您添加
<script src="http://..../someData.js?callback=some_func"/>
在您的页面上。
应该调用some_func(),以便通知您数据已放入。
在服务器上设置一个简单的反向代理,将允许浏览器将相对路径用于Ajax请求,而服务器将充当任何远程位置的代理。
如果在Apache中使用mod_proxy,则设置反向代理的基本配置指令是ProxyPass
。通常按以下方式使用:
ProxyPass /ajax/ http://other-domain.com/ajax/
在这种情况下,浏览器将能够请求/ajax/web_service.xml
作为相对URL,但是服务器将通过充当代理来实现此目的http://other-domain.com/ajax/web_service.xml
。
此方法的一个有趣特征是,反向代理可以轻松地向多个后端分配请求,从而充当负载平衡器。
这几乎分析了可用的内容:http : //www.slideshare.net/SlexAxton/breaking-the-cross-domain-barrier
对于postMessage解决方案,请查看:
https://github.com/chrissrogers/jquery-postmessage/blob/master/jquery.ba-postmessage.js
和一个稍有不同的版本:
https://github.com/thomassturm/ender-postmessage/blob/master/ender-postmessage.js