Javascript 使用DNS欺骗绕过同源策略

Javascript 使用DNS欺骗绕过同源策略,javascript,same-origin-policy,Javascript,Same Origin Policy,我正在用Javascript编写一个web应用程序,它需要访问第三方API(位于x.apisite.com和y.apisite.com)。我使用的是XMLHTTPRequest,但是当从我自己的本地服务器提供文件时,由于同源策略,这失败了 现在,这个web应用程序应该安装在我的移动设备上,任何下载的文件都将被缓存。因此,我将DNS条目更改为指向我自己的本地服务器的x.apisite.com和y.apisite.com。然后我下载文件,然后将DNS条目更改回正确的条目。我想既然浏览器认为脚本是从*

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

现在,这个web应用程序应该安装在我的移动设备上,任何下载的文件都将被缓存。因此,我将DNS条目更改为指向我自己的本地服务器的
x.apisite.com
y.apisite.com
。然后我下载文件,然后将DNS条目更改回正确的条目。我想既然浏览器认为脚本是从
*.apisite.com
下载的,我现在可以将
XMLHTTPRequest
s转换为
*.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
中,我对
x.apisite.com
做了一个
XMLHTTPRequest
,同样在
script-1.js
中,我访问
y.apisite.com
实用答案(不推荐):从您控制的域向第三方域创建CNAME记录,然后使用这些域,希望第三方的主机不会查看HTTP主机头。请注意,如果客户机尝试验证第三方主机,这也不会起作用;例如,在使用HTTPS时(某些客户端浏览器可能会在某些情况下强制使用HTTPS)

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

备选方案:如果第三方不想允许客户端使用域中的代码进行跨源请求,那么您必须自己(从服务器)进行这些请求。然后,您发送到客户端浏览器的代码将只与同一来源进行交互,但这也意味着如果您代理请求,用户将不得不信任您的凭据(如果相关),或者您必须拥有自己的凭据才能向第三方主机验证服务器,这让你可以在那里做任何你想做的事情。这还意味着您还需要承担流量负载,这可能会很重,也可能不会很重,具体取决于应用程序。还有许多其他潜在的影响,这些影响都源于您明确承担这些请求的责任这一事实

注意:虽然这听起来有点复杂,但了解用户、用户的客户端浏览器、在浏览器中执行的代码、该代码的来源以及该代码向其发出请求的域之间的信任机制可能会很有用。始终牢记各方的最大利益,这样就很容易为您的具体问题找到解决方案

最终答案(每个人都讨厌它,但你可能早就预料到了):“这取决于你到底想做什么。”(对不起。)

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

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

备选方案:如果第三方不想允许客户端使用域中的代码进行跨源请求,那么您必须自己(从服务器)进行这些请求。然后,您发送到客户端浏览器的代码将只与同一来源进行交互,但这也意味着如果您代理请求,用户将不得不信任您的凭据(如果相关),或者您必须拥有自己的凭据才能向第三方主机验证服务器,这让你可以在那里做任何你想做的事情。这还意味着您还需要承担流量负载,这可能会很重,也可能不会很重,具体取决于应用程序。还有许多其他潜在的影响,这些影响都源于您明确承担这些请求的责任这一事实

注意:虽然这听起来有点复杂,但了解用户、用户的客户端浏览器、在浏览器中执行的代码、该代码的来源以及该代码向其发出请求的域之间的信任机制可能会很有用。始终牢记各方的最大利益,这样就很容易为您的具体问题找到解决方案

最后一个答案(每个人都讨厌它,但你可能已经预料到了):“这取决于你到底想做什么。”(对不起。)

“我想既然浏览器认为脚本是从
*.apisite.com
下载的,我现在可以将
XMLHTTPRequests
发送到
*.apisite.com
”--客户端脚本的来源与相同的来源规则无关。SOP术语中的源原点始终是加载脚本并执行某些操作的实际页面的原点。您可能可以不受DNS欺骗,但您需要欺骗浏览器,使其认为HTML页面本身来自
apisite.com
“我想,既然浏览器认为脚本是从
*.apisite.com
下载的,我现在可以将
XMLHTTPRequests
设置为
*.apisite.com
”--客户端脚本的来源没有关系