1

javascript から別の Web ページ (フルスクリーンの 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://other.comを自分のサイトhttp://mine.orgにロードするとします。 次のように呼び出すことができる小さなサーバーサイド スクリプトを作成します: 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引数を受け入れてもらい、あなたのために何かをしてもらいます

ユーザーの操作が必要な残りの方法 1:

(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 に答える