用DNS技巧绕过同源政策

时间:2013-06-30 17:17:58

标签: javascript same-origin-policy

我正在编写一个带有Javascript的网络应用,需要访问第三方API(位于x.apisite.comy.apisite.com)。我正在使用XMLHTTPRequest,但是当从我自己的本地服务器提供文件时,由于同源策略而失败。

现在,这个网络应用程序应该安装在我的移动设备上,其中任何下载的文件都将被缓存。因此,我将DNS条目更改为指向x.apisite.comy.apisite.com到我自己的本地服务器。然后我下载文件,然后将DNS条目更改回正确的条目。我认为,由于浏览器认为脚本是从*.apisite.com下载的,我现在可以将XMLHTTPRequest设为*.apisite.com。但是,情况似乎并非如此,我仍然会得到同源政策错误。

我做错了什么?

以下是我正在做的基本想法:

<!DOCTYPE html>
<html>
    <head>
        <!-- this will actually be downloaded from my own local server -->
        <script src="http://x.apisite.com/script-0.js">
        <script src="http://y.apisite.com/script-1.js">
...

script-0.js中,我XMLHTTPRequestx.apisite.com,同样在script-1.js,我访问y.apisite.com

1 个答案:

答案 0 :(得分:1)

实用答案(不推荐):从您控制的域向第三方域创建CNAME记录,然后使用这些域并希望第三方的主机不查看HTTP Host标头。请注意,如果客户端尝试对第三方主机进行身份验证,则此操作无效;例如,在使用HTTPS时(某些客户端浏览器可能会在某些情况下强制使用HTTPS)。

理想答案:要求第三方授权使用CORS来自您的原始域的代码发出的请求(某些主机已经允许来自任何来源的代码请求,您应该检查)。

替代方案:如果第三方不希望客户端使用您域中的代码进行跨域请求,那么您必须自己(从您的服务器)提出这些请求。您发送到客户端浏览器的代码只会与相同的源进行交互,但这也意味着如果您代理对它们的请求(如果相关),则用户必须信任您的凭据,或者您必须拥有凭据您自己的服务器向第三方主机验证您的服务器,这允许您做任何你想做的事情。它还意味着您也可以承担流量负载,根据应用程序的不同,流量负载可能会很大也可能不会很大。可能存在许多其他影响,这些影响都源于您明确承担这些请求的责任。

注意:虽然这听起来有点复杂,但理解用户,用户的客户端浏览器,浏览器中执行的代码,代码的来源以及用户的域之间的信任机制可能很有用。代码发出请求。始终牢记每一方的最佳利益,并且很容易为您的特定问题找到解决方案。

最终答案(每个人都讨厌它,但你可能会想到它):“这取决于你究竟要做什么。” (对不起。)