how to bypass Access-Control-Allow-Origin?
我在他们设置的平台上对我自己的服务器进行ajax调用,阻止这些ajax调用(但我需要它从我的服务器获取数据以显示从我服务器的数据库中检索的数据)。
我的ajax脚本正在运行,它可以将数据发送到我服务器的php脚本以允许它处理。
但是,它无法获取已处理的数据,因为它被
我无法访问该平台的源/核心。 所以我无法删除它禁止我这样做的脚本。
(P / S我使用谷歌Chrome的控制台,发现了这个错误)
Ajax代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $.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("Friends:"+friend+" Blogs:"+blog); } }); |
或者上面的ajax脚本是否有
我希望有人可以帮助我。
把它放在retrieve.php之上:
1 | header('Access-Control-Allow-Origin: *'); |
请注意,这有效地禁用了CORS保护,并使您的用户受到攻击。如果您不完全确定需要允许所有来源,则应将其锁定为更具体的来源:
1 | header('Access-Control-Allow-Origin: https://www.example.com') |
好的,但是你们都知道*是一个通配符并允许来自每个域的跨站脚本?
您希望为每个允许的站点发送多个
您可以通过检查原点来解决此问题,并在标题中发送回来,如果允许的话:
1 2 3 4 5 6 7 8 9 10 | $origin = $_SERVER['HTTP_ORIGIN']; $allowed_domains = [ 'http://mysite1.com', 'https://www.mysite2.com', 'http://www.mysite2.com', ]; if (in_array($origin, $allowed_domains)) { header('Access-Control-Allow-Origin: ' . $origin); } |
那更安全。您可能希望编辑匹配并将其更改为具有某些正则表达式的手动函数,或类似的东西。至少这只会发回1个标题,你将确定它是请求来自的标题。请注意,所有HTTP标头都可以被欺骗,但此标头是为了客户端的保护。不要使用这些值保护您自己的数据。如果您想了解更多信息,请阅读CORS和CSRF。
为什么它更安全?
允许从其他位置访问,然后您自己的可信站点允许会话劫持。我将用一个小例子 - 图片Facebook允许一个通配符来源 - 这意味着你可以在某个地方创建自己的网站,并让它向Facebook发起AJAX调用(或打开iframe)。这意味着您可以获取您网站访问者的Facebook的登录信息。更糟糕的是 - 您可以在某人的Facebook上编写
使用
警告,Chrome(和其他浏览器)会抱怨如果您按照其他一些答案设置了多个ACAO标头。
错误将类似于
试试这个:
1 2 3 4 5 6 7 8 9 10 11 | $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控制器时修复了这个问题。
我补充说:
1 | Response.AddHeader("Access-Control-Allow-Origin","*"); |
在我之前
1 | return Json(model, JsonRequestBehavior.AllowGet); |
而且我的
希望有所帮助。
最好的是允许单个域名,请注意http://:
1 2 | header('Access-Control-Allow-Origin: http://www.foo.com', false); header('Access-Control-Allow-Origin: http://www.foo2.com', false)); |
您是否尝试过将Access-Control-Allow-Origin标头添加到服务器发送的响应中?喜欢,
使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | class CorsAccessControl { private $allowed = array(); /** * Always adds your own domain with the current ssl settings. */ public function __construct() { // Add your own domain, with respect to the current SSL settings. $this->allowed[] = 'http' . ( ( array_key_exists( 'HTTPS', $_SERVER ) && $_SERVER['HTTPS'] && strtolower( $_SERVER['HTTPS'] ) !== 'off' ) ? 's' : null ) . '://' . $_SERVER['HTTP_HOST']; } /** * Optionally add additional domains. Each is only added one time. */ public function add($domain) { if ( !in_array( $domain, $this->allowed ) { $this->allowed[] = $domain; } /** * Send 'em all as one header so no browsers grumble about it. */ public function send() { $domains = implode( ', ', $this->allowed ); header( 'Access-Control-Allow-Origin: ' . $domains, true ); // We want to send them all as one shot, so replace should be true here. } } |
用法:
1 2 3 4 5 6 7 8 9 10 11 | $cors = new CorsAccessControl(); // If you are only authorizing your own domain: $cors->send(); // If you are authorizing multiple domains: foreach ($domains as $domain) { $cors->add($domain); } $cors->send(); |
你明白了。