在第三方域上调用JavaScript

时间:2009-01-14 01:53:31

标签: javascript dom cross-domain-proxy

我想写一些javascript并让它调用DOM来获取我从第三方域加载的页面。可以这样做吗? This看起来就像我使用IFRAME尝试的那样,但似乎不起作用。这些是其他方式,如FF直接运行一些JavaScript而不是作为页面的一部分?

我知道这有各种各样的安全问题,但我是编写代码的人,也是唯一能够运行代码的人。


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

我的IFRAME次传递不起作用,因为来自file:////....的网页与http://whatever.com中的网页不在同一个域中。惊喜,惊喜。

8 个答案:

答案 0 :(得分:4)

如果我正确理解了这个问题,您可能无法单独使用Javascript,因为您遇到了域限制。但是,如果您对使用shell脚本或任何脚本语言有一些了解,那么它应该没有问题,您需要做的只是调用旧的卷曲。

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解析它。无论哪种方式,如果你通过卷曲做它应该工作正常。希望有所帮助。

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

  

Apache的mod_proxy将接受类似“/ foo”的请求,并实际将请求隧道传送到某个远程目标,如“http://dev.domain.com/bar”。最终结果是您的Web浏览器认为您已拨打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>

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

  

最后,Selenium Server充当了   客户端配置的HTTP代理,站起来   在浏览器和你的之间   网站。这允许一个   启用S​​elenium的浏览器运行   任意网站上的JavaScript。

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

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

答案 4 :(得分:1)

有一种方法可以放宽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的错误似乎已得到修复。

答案 5 :(得分:0)

我不确定我是否完全理解这个问题,也许你可以更多地描述这种情况......但是如果你跨域访问,我猜你正在遇到跨站点脚本的安全问题。 / p>

所以..

可能会检查document.domain属性,该属性可以在大多数浏览器中启用跨窗口对象的脚本访问。

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

答案 6 :(得分:0)

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

看了之后看起来似乎有点受限制,而且文档有点多,而且吃得不够。

答案 7 :(得分:0)