如何绕过Access-Control-Allow-Origin?
我在他们设置的平台上对我自己的服务器进行ajax调用,以防止这些ajax调用(但是我需要它从我的服务器获取数据以显示从我的服务器数据库中检索到的数据)。 我的ajax脚本正在工作,它可以将数据发送到我的服务器的PHP脚本,让它来处理。 但是,由于"Access-Control-Allow-Origin"
被阻止,因此无法获取已处理的数据。
我无法访问该平台的源代码/核心。 所以我不能删除不允许我这样做的脚本。 (P / SI使用Google Chrome的控制台,发现这个错误)
Ajax代码如下所示:
$.ajax({ type: "GET", url: "http://example.com/retrieve.php", data: "id=" + id + "&url=" + url, dataType: 'json', cache: false, success: function(data) { var friend = data[1]; var blog = data[2]; $('#user').html("<b>Friends: </b>"+friend+"<b><br> Blogs: </b>"+blog); } });
还是有一个JSON
等效的代码上面的ajax脚本? 我认为JSON
是允许的。
我希望有人能帮助我。
把它放在retrieve.php之上
header('Access-Control-Allow-Origin: *');
需要注意的是,必须在发送任何实际输出之前调用header()
。
错误
<html> <?php header('Access-Control-Allow-Origin: *'); ?>
正确
<?php header('Access-Control-Allow-Origin: *'); ?> <html>
好吧,但是你们都知道*是通配符,并且允许来自每个域的跨站点脚本?
为什么不把自己的,可信的域名(和协议)列入清单;
header('Access-Control-Allow-Origin: http://mysite1.com', false); header('Access-Control-Allow-Origin: http://example.com', false); header('Access-Control-Allow-Origin: https://www.mysite2.com', false); header('Access-Control-Allow-Origin: http://www.mysite2.com', false);
这更安全。 (第二个参数“false”告诉header()
函数不要覆盖旧的)
为什么更安全?
允许从其他位置访问,那么你自己的可信站点允许会话劫持。 我要去一个小例子 – 图像Facebook允许通配符来源 – 这意味着你可以使自己的网站的地方,并使其触发的AJAX调用(或打开iframes)到Facebook。 这意味着你可以抓取你的网站访问者的Facebook的login信息。 更糟糕的是,只要在浏览您的网站时,您可以编写POST
请求并在某人的脸书上发布数据。
使用ACAO
标头时要非常小心!
警告 ,Chrome(和其他浏览器)会抱怨说,如果您遵循其他一些答案,则会设置多个ACAO标头。
错误将会像XMLHttpRequest cannot load ____. The 'Access-Control-Allow-Origin' header contains multiple values '____, ____, ____', but only one is allowed. Origin '____' is therefore not allowed access.
XMLHttpRequest cannot load ____. The 'Access-Control-Allow-Origin' header contains multiple values '____, ____, ____', but only one is allowed. Origin '____' is therefore not allowed access.
尝试这个:
$http_origin = $_SERVER['HTTP_ORIGIN']; $allowed_domains = array( 'http://domain1.com', 'http://domain2.com', ); if (in_array($http_origin, $allowed_domains)) { header("Access-Control-Allow-Origin: $http_origin"); }
调用MVC3控制器时,我解决了这个问题。 我补充说:
Response.AddHeader("Access-Control-Allow-Origin", "*");
在我之前
return Json(model, JsonRequestBehavior.AllowGet);
而且我的$.ajax
也在抱怨说,它不接受我的ajax调用中的Content-type头文件,所以我把它评论出来,因为我知道它的JSON被传递给了Action。
希望有所帮助。
最好的办法是允许单个域名,小心http://:
header('Access-Control-Allow-Origin: http://www.foo.com', false); header('Access-Control-Allow-Origin: http://www.foo2.com', false));
您是否尝试过将Access-Control-Allow-Origin头添加到从服务器发送的响应中? 像, Access-Control-Allow-Origin: *
?