1

我想从 javascript 打开另一个网页(如默认导航,而不是全屏 iframe 或 window.open)并在加载时运行一些 javascript 代码。

脚步:

  1. 定义一个javascript函数
  2. 导航到另一个页面
  3. 浏览器在新页面上下文中运行功能

有没有办法做到这一点?我记得的唯一方法是通过使用ajax 加载页面并替换document.body.innerHtml 来模拟这一点,然后运行该函数,但这不会改变location.href,因此例如后退按钮或书签将不起作用。还必须在加载时重写相关链接等...

PS:我知道这会是一些丑陋的 XSS,但例如在编写加载页面并自动填写表单的小书签时需要它。

4

4 回答 4

2

不,你不能那样做。这将允许你做一些事情,比如在幕后窃取 cookie 以进行会话劫持,所以根本没有浏览器允许你这样做。

于 2013-04-14T08:49:19.340 回答
1

如果您从自己的服务器加载其他页面,则可以执行所有这些操作:

假设你想在你的站点http://mine.org中加载http://other.com 你编写了一个小的服务器端脚本,你可以像这样调用它: http://mine.org/load.php?site1 (使用您要加载的所有站点的 URL 在 load.php 或某些数据库中列出)

但是现在您的站点存在安全问题:嵌入在 http://other.com中的 javascript 在您的站点上下文中运行。

于 2013-04-14T09:09:30.807 回答
1

虽然可能有一些合法的用例,但出于安全原因,除非新页面位于同一域中,否则您不能这样做。

如果目标浏览器支持扩展,您可以做的是编写浏览器扩展,

或者告诉用户打开目标页面,并在该上下文中使用您的书签。

于 2013-04-14T08:49:27.663 回答
-1

OK,研究结果:

不可能的方法:

  • 使用一些持久性功能在新页面上运行(就像我在问题中建议的那样)
  • 使用 iframe 替换整个页面(丑陋且被大多数浏览器禁止)

矫枉过正的方法:

  • 写一个浏览器插件
  • 让远程页面所有者接受一些 GET 参数并为你做这些事情

剩下的方法一,需要用户交互:

(function(){
  if(self.location.href!=targetlocation){
    window.alert("Please run this bookmarklet again upon loading the page.");
    self.location.href=targetlocation;
  }else{
    doSomething();
  }
  return false;
})();

剩下的方法2,做一些讨厌的代理的东西:

  • 编写一些 php/etc 脚本来“代理”目标页面
  • 现在你可以:
    • 使用 iframe,因为它不再是跨站点的
    • 在交付给浏览器之前重写页面服务器端(自己做“矫枉过正的方法:GET参数”)

例子:

<?php //USAGE: ?uri=http://www.google.com&search[0]=L2dvb2dsZS8K&replace[0]=dGVzdAo=
  $page=file_get_contents($_GET["uri"]);
  $count = min(count($_GET["search"]),count($_GET["replace"]),100);
  for ($i = 0; $i < $count; $i++) {
    $page=preg_replace(base64_decode($_GET["search"][$i]),
                       base64_decode($_GET["replace"][$i]), $page);
  }
  echo $page;
?>
于 2013-04-14T09:13:02.640 回答