Javascript 跨站点XMLHttpRequest
我想提供一段Javascript代码,它可以在包含它的任何网站上运行,但它总是需要在承载Javascript的服务器上获取更多数据(甚至修改数据)。我知道有明显的安全限制 考虑托管在xyz.com上的index.html,其中包含以下内容:Javascript 跨站点XMLHttpRequest,javascript,ajax,xmlhttprequest,xss,Javascript,Ajax,Xmlhttprequest,Xss,我想提供一段Javascript代码,它可以在包含它的任何网站上运行,但它总是需要在承载Javascript的服务器上获取更多数据(甚至修改数据)。我知道有明显的安全限制 考虑托管在xyz.com上的index.html,其中包含以下内容: <script type="text/javascript" src="http://abc.com/some.js"></script> some.js是否能够使用XMLHttpRequest将数据发布到abc.com?换句话
<script type="text/javascript" src="http://abc.com/some.js"></script>
some.js是否能够使用XMLHttpRequest将数据发布到abc.com?换句话说,abc.com是否被隐式信任,因为我们从那里加载了Javascript?最简单的选择是通过加载Javascript的服务器代理调用。因此some.js将调用托管服务器,该服务器将请求转发到abc.com 当然,如果这不是一个选项,因为您无法控制主机,那么有一些选项,但它似乎陷入了跨浏览器的困境: some.js是否能够使用XMLHttpRequest将数据发布到abc.com?换句话说,abc.com是否因为我们从那里加载了Javascript而被隐式信任 不,因为脚本加载到一个单独的域中,所以它没有访问权限 如果您信任数据源,那么JSONP可能是更好的选择。JSONP涉及动态地向页面添加新的脚本元素,将SRC设置为另一个域,并在查询字符串中使用回调集作为参数。例如:
function getJSON(URL,success){
var ud = 'json'+(Math.random()*100).toString().replace(/\./g,'');
window[ud]= function(o){
success&&success(o);
};
document.getElementsByTagName('body')[0].appendChild((function(){
var s = document.createElement('script');
s.type = 'text/javascript';
s.src = URL.replace('callback=?','callback='+ud);
return s;
})());
}
getJSON('http://YOUR-DOMAIN.com/script.php?dataName=john&dataAge=99&callback=?',function(data){
var success = data.flag === 'successful';
if(success) {
alert('The POST to abc.com WORKED SUCCESSFULLY');
}
});
因此,您需要托管自己的脚本,该脚本可以使用PHP/CURL发布到abc.com域,然后以JSONP格式输出响应:
我对PHP不是很在行,但可能是这样的:
<?php
/* Grab the variables */
$postURL = $_GET['posturl'];
$postData['name'] = $_GET['dataName'];
$postData['age'] = $_GET['dataAge'];
/* Here, POST to abc.com */
/* MORE INFO: http://uk3.php.net/curl & http://www.askapache.com/htaccess/sending-post-form-data-with-php-curl.html */
/* Fake data (just for this example:) */
$postResponse = 'blahblahblah';
$postSuccess = TRUE;
/* Once you've done that, you can output a JSONP response */
/* Remember JSON format == 'JavaScript Object Notation' - e.g. {'foo':{'bar':'foo'}} */
echo $_GET['callback'] . '({';
echo "'flag':' . $postSuccess . ',";
echo "'response':' . $postResponse . '})";
?>
您可以使用。它是一个库,允许您传递数据,并跨域边界调用方法。这很容易,你应该能够使用它。
在code.google.com网站上有很多例子