有没有办法绕过访问控制允许来源?

Posted

技术标签:

【中文标题】有没有办法绕过访问控制允许来源?【英文标题】:Is there a way around Access-Control-Allow-Origin? 【发布时间】:2015-07-21 09:52:04 【问题描述】:

我正在使用 JIRA 的 API 来获取有关错误的一些信息。这是我用来获取它的 JQuery 示例:

var endpoint = 'https://jira.cyanogenmod.org/rest/api/latest/issue/CYAN-2631';
$.get(endpoint, function(data) 
    do_stuff(data, data['fields']['project']['self']);
);

而且,我遇到了可怕的Access-Control-Allow-Origin 错误。它看起来像这样:

XMLHttpRequest cannot load 
https://jira.cyanogenmod.org/rest/api/latest/issue/CYAN-2631. 
No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://127.0.0.1:8000' is therefore not allowed access.

如果可能的话,我真的很想使用这个 API。遵循question 上的指示并没有帮助。我又遇到了一个错误,

GET https://jira.cyanogenmod.org/rest/api/latest/issue/CYAN-2631callback=jQuery172039181585889309645_1431307158851?_=1431307165515 

似乎是一个 Jquery 错误,所以我认为这不是正确的方法。也许服务器不允许jsonp

无论如何,有没有人有办法解决这个问题,或者我可以不使用这个特定的 API?谢谢

【问题讨论】:

你应该问 JIRA。 【参考方案1】:

没有外部代码,无法完全从浏览器启用跨源请求。如果有,那将完全违背安全保护的初衷。

使用浏览器时,由服务器决定是否要支持跨源请求以及要支持来自哪些域的请求。您无法在客户端绕过它。

选择是:

    服务器允许从您的域或所有域访问 COR。 服务器支持 JSONP,让您可以使用它来解决跨源访问问题。 您创建自己的服务器代理,从浏览器向您自己的服务器发出请求(可能是同源或启用 CORS),然后您自己的服务器从其他站点获取数据并将其返回给浏览器。服务器不受相同来源限制的限制,因为这是仅内置于浏览器中的安全功能。 您会找到一些第三方代理服务,您可以使用它们来实现与选项 #3 相同的目的。

仅供参考,Google 搜索出现了这篇关于在 API 上启用 CORS 的文章:https://answers.atlassian.com/questions/69356/cross-origin-resource-sharing-with-jira-rest-api-and-javascript。我对该服务的了解还不够,无法完全按照文章进行操作,但它可能会为您指明一个有用的方向。

【讨论】:

这是一个很好的答案,所以我会保留它作为接受的答案。不过,我应该提一下,我意识到这是浏览器的事情。我找到了一个名为 CORS 的 Google-chrome 插件,它允许你提出这个请求并且它完全可以工作。不知道这对推送到实时网站有什么影响,但至少我现在可以在 localhost 上破解了 :)【参考方案2】:

你好,简短的回答是“是”。

中等答案是“在您的应用程序服务器上启用 CORS”

长答案在这里:http://enable-cors.org/

在某些时候您会遇到“飞行前请求”的概念,您可能会感到困惑。

那是因为它令人困惑、愚蠢且设计不佳。继续前进。

启用 CORS 的最简单方法是在您的网络服务器(nginx 或 apache)上,不过,您可以在应用程序本身中启用它。

http://enable-cors.org/ 站点列出了各种 Web 服务器和应用程序堆栈的配置。

祝你好运!

【讨论】:

对不起,我应该在我的问题中说明这一点!如果我想在客户端上做这一切,还有可能吗?仅 JS? 嘿,亚历克斯,别担心。是的,这是可能的。 @jfriend00 的回答很好地说明了方法。

以上是关于有没有办法绕过访问控制允许来源?的主要内容,如果未能解决你的问题,请参考以下文章

如何绕过访问控制允许来源?

如何绕过访问控制允许来源?

如何绕过访问控制允许来源?

如何绕过访问控制允许来源?

访问控制允许来源多个来源域?

访问控制允许来源多个来源域?