【问题标题】:Invoke JavaScript on 3rd party domain在 3rd 方域上调用 JavaScript
【发布时间】:2009-01-14 01:53:30
【问题描述】:

我想编写一些 javascript 并让它调用我从 3rd 方域加载的页面的 DOM。这可以做到吗? This 看起来像我已经尝试过使用 IFRAME 但它似乎不起作用。这些是否有其他方式,比如让 FF 直接运行一些 javascript 而不是作为页面的一部分?

我知道这存在各种安全问题,但我是编写代码的人,也是唯一会运行它的人。


背景故事:我正在尝试自动化一些网站迭代。

我的拳头IFRAME 通行证无效,因为来自file:////.... 的网页与http://whatever.com 中的网页不在同一个域中。惊喜,惊喜。

【问题讨论】:

    标签: javascript dom cross-domain-proxy


    【解决方案1】:

    如果我正确理解了这个问题,由于您遇到的域限制,您可能无法单独使用 Javascript 来完成此操作。但是,如果你对使用 shell 脚本或任何脚本语言有一定的了解,那应该没问题,你需要做的就是调用好旧的 curl。

    PHP 中的示例:

    <?php
    $url = "http://www.example.com/index.html";
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0');
    $fp = curl_exec($ch);
    curl_close($ch);
    ?>
    

    差不多就是这样。您在 $fp 变量中有实际的 HTML 代码。所以,总而言之,我要做的是向 PHP 编写一个小的 Javascript Ajax 函数,该函数执行 curl,然后通过 echo 将 $fp 变量返回给 Javascript 回调,然后可能将其插入到文档中(使用 innerHTML 或DOM)和 bam,你可以访问所有的东西。或者你可以只用 PHP 解析它。无论哪种方式,如果您通过 curl 进行操作,应该可以正常工作。希望对您有所帮助。

    编辑:经过一番思考,我似乎记得 Safari 删除了 localhost 的跨域限制。在研究了更多之后,我找不到任何支持我的这个理论的文档,所以我挖得更深一点,找到了一个更好(虽然更黑客)的方法来通过 Apache 完成这整个混乱,如果你正在使用它(哪个你可能是)。

    Apache 的 mod_proxy 将接受“/foo”之类的请求,并将请求通过隧道传送到某个远程目标,例如“http://dev.domain.com/bar”。最终结果是您的网络浏览器认为您已经调用了http://localhost/foo,但实际上您正在从远程服务器发送和检索数据。安全隐患已解决!

    例子:

    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    LoadModule rewrite_module modules/mod_rewrite.so
    

    假设我想访问http://dev.domain.com/remote/api.php 的文件。您可以将以下所有内容放入:

    # start mod_rewrite
    RewriteEngine On
    ProxyRequests Off
    <Proxy>
       Order deny,allow
       Allow from all
    </Proxy>
    
    ProxyPass /apitest/ http://dev.domain.com/remote/api/
    ProxyPassReverse /apitest/ http://dev.domain.com/remote/api/
    RewriteRule ^/apitest/(.*)$ /remote/api/$1 [R]
    

    Source

    更多编辑:

    考虑到您希望如何避免整个服务器设置问题,我在 Safari (Mac) 上使用 IFRAME 进行了尝试,并且至少对于我尝试过的域来说它有效:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
    <html>
    <head>
    </head>
        <body>
            <iframe src="http://www.stackoverflow.com/"></iframe>
        </body>
    </html>
    

    【讨论】:

    • 这可能行得通。然而,如果网页做了任何花哨的步法(比如在它自己的 DOM 中使用 javascript),那将无法满足我的需求。
    • 哦,是的,但是除非您可以实际将代码添加到第三方站点,我对此表示怀疑,否则可能无法真正获得他们的 DOM 操作。但是,如果你有任何机会在 Mac 或 Windows 机器上工作,我认为 Safari 没有 localhost 的域限制。
    • 所以从 localhost 加载的页面可以包含与框架/iframe 不同的 javascript?很高兴知道。
    • 我有点希望有一个不需要任何服务器的解决方案。
    • +1 包括您的“实验工作流程”——非常有用,比您刚刚提到的结果更重要。
    【解决方案2】:

    阅读bookmarklets。基本思想是您创建一个书签,该书签执行一些 Javascript 代码,该代码将 Javascript 动态注入到您浏览器中当前加载的页面中。大多数网页剪辑应用程序都是这样做的。

    【讨论】:

      【解决方案3】:

      JavaScript 具有相同的域策略。您将无法访问其他域。这是为了保护你有黑客/坏人。

      【讨论】:

        【解决方案4】:

        看看Selenium Remote-Control。服务器充当浏览器绕过同域策略的代理:

        最后,Selenium 服务器充当了一个 客户端配置的 HTTP 代理,站 在浏览器和您的 网站。这允许一个 支持 Selenium 的浏览器运行 任意网站上的 JavaScript。

        您可以考虑应用相同的方法并编写自己的代理,甚至是一个简单的 Web 应用程序来回显来自其他域的页面(请参阅 Dave's answer)。

        或者,只需使用 Selenium 进行自动化。

        【讨论】:

          【解决方案5】:

          有一种方法可以放松 Firefox 的域安全性。

          1 将此行添加到 Firefox 的 user.js。

          user_pref("signed.applets.codebase_principal_support", true);

          2 将此行添加到需要跨域的每个 javascript 函数中。

          netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead UniversalBrowserWrite");

          3 Firefox 第一次尝试跨域时,它会警告您该尝试并提示您的许可。

          好消息,阻止它与 Firefox 3 一起使用的错误似乎已修复。

          【讨论】:

          • crud 工作量很大! (大多数时候这是一件好事)
          • 绕过安全不应该是微不足道的 =) 提示只出现一次。假设您希望您的网页访问其他站点 1、2 和 3。您加载您的页面并访问 other1,并且您选择允许跨域访问。现在,当你的服务器访问 1、2 或 3 时,没有任何提示。
          【解决方案6】:

          我不确定我是否完全理解这个问题,也许你可以更详细地描述一下这种情况......但我猜如果你跨域访问,你会遇到跨站点脚本安全问题。

          所以..

          也许签出document.domain 属性,它可以在大多数浏览器中启用跨窗口对象的脚本访问。

          两个站点必须通过同一个主域访问,但可以有不同的子域,只要 document.domain 设置为两个站点上域的“主”部分。

          【讨论】:

            【解决方案7】:

            不是我想的,但是:iMacros 可能会做一些我想做的事情。

            看了之后似乎有点局限,而且文档有点花哨,肉不够。

            【讨论】:

              【解决方案8】:
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-11-25
              • 1970-01-01
              • 2020-09-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-04-10
              相关资源
              最近更新 更多