繁体   English   中英

在第三方域上调用JavaScript

[英]Invoke JavaScript on 3rd party domain

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

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


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

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

如果我正确理解了这个问题,您可能无法单独使用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]

资源

更多编辑:

看到你想要避免整个服务器设置的事情,我在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>

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

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

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

最后,Selenium Server充当客户端配置的HTTP代理,位于浏览器和您的网站之间。 这允许支持Selenium的浏览器在任意网站上运行JavaScript。

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

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

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

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

所以..

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

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

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

看之后它看起来有点受限制,而且文档有点多,但没有足够的肉。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM