javascript で 別ウィンドウのスクリプトを操作する場合の制限について、教えてください

IE6で動作検証をしています

やりたいこと
・ブラウザを立ち上げ、ページAを表示
・ブラウザを別に立ち上げ、ページBを表示
・ページAでボタンをクリックしたときに、ページBの javascriptのメソッドをコール

できないこと
・ページAとページBが別サーバのとき、ドメイン規制にひっかかってしまい、実行できない

知りたいこと
・自サーバでイントラ内環境であるため、ドメインのつけ方で回避できるようならつけ方を教えてほしい(IIS6.0)
 ページAとページBは別サーバにしなければいけない前提です
・ドメインが別であっても、実行できるような方法
 ただし、WSHを使わない方法で(http://d.hatena.ne.jp/fits/20090301/1235879562

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2009/09/09 08:36:16
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:i4ooon No.1

回答回数56ベストアンサー獲得回数20

ポイント60pt

you_gotさんが実現したいことがわかりませんが、こういうXSS回避手法もあります。

[ページA]http://regnif.web.fc2.com/test/counterXSS/index.html

[ページB]http://regnif.web.fc2.com/test/counterXSS/xdomain.html

当然、ページAとページBは別ドメインで動きます。

ページBがどのURLになるかはページAに記述targetDomainがありますので、修正してください。

おそらくは[ページA]のメソッドの書き方次第で、JSで可能なことは、ほぼ何でも実現できると思います。

ポイントは[ページA]の実行したいメソッドはアンカー(#以降)の文字列で[ページB]から指定。

[ページB]では#以降を取得して、eval関数で実行。あたりまえですが、[ページA]にどういう名前の

メソッドが存在するかは[ページB]は知っている前提。

また、本来[ページB]ではイベントリスナー形式でURL変更をキャッチしたいのですがイベント名が

わからなかったので、あまりキレイじゃないですがsetIntervalにてURL変更を監視している。


↓説明

ブラウザを立ち上げ、ページAを表示

[ページA]を開きます。

---

ブラウザを別に立ち上げ、ページBを表示

[ページA]の [1]openhoge ボタンをクリックすると

[ページB]

を開きます。

このとき、[ページB]のメソッドhoge()を実行します。

---

ページAでボタンをクリックしたときに、ページBの javascriptのメソッドをコール

[ページA]の [2]openfoo ボタンをクリックすると

[ページB]のメソッドfoo()を実行します。

--------------

「やりたいこと」の2番目の別ブラウザ[ページB]を立ち上げるというのが、[ページA]からという意味でない場合、ご希望の動作はほぼ不可能です。

id:you_got

なるほど

こうすれば、ページの再読込みもおきませんし、情報を渡すことができますね

ただ、イベントを使えないのはちょっとつらいですね。。

2009/09/07 16:12:46
  • id:you_got
    やりたいことは、こちらの記事と似ています
    http://chaichan.web.infoseek.co.jp/qa5500/qa5806.htm

    クロスドメイン制約にひっかからず、うまくいっている例のようです
  • id:i4ooon
    1番目の回答者です。
    you_gotさんがコメントに類似事例としてあげた情報を
    参考にwindow.openではなく、別ウィンドウで立ち上げたものでも、もう一方の
    メソッド実行が可能でしたので、訂正します。
    タブの場合はダメみたいです。
  • id:i4ooon
    イベントが使えないというのは、ブラウザのアドレス欄location.hrefの変更のイベントハンドラ名がわからない(存在しない?)だけで、他の通常のイベント処理は問題ないです。
    アドレス欄変更をsetIntervalで監視することで生じる不都合があれば、それを挙げてください。何か解決策があるかも知れません。
  • id:you_got
    いろいろと考えていただきありがとうございます
    本当に助かりました

    > setIntervalで監視することで生じる不都合

    心配なのはリソースの無駄遣いです
    1000ms 程度の Interval なら、それほど消費しませんが。。


    結局、無い知恵を絞ってiFrameを使うことにしました。


    ドメインA
    ・ページA

    ドメインB
    ・ページB1
    ・ページB2

    ページAが渡したい引数
    123456789

    ページB2の、外部から値を受け取る関数
    ページB2.SetKeyFunction

    1.ページAは javascript で動的に Iframe を生成

    2.iframe に http://ドメインB/ページB1.html?key=123456789 をセット

    3.http://ドメインB/ページB1.html は 自分の URLからkeyを取得

    4.ページB1は、window.open("", "Child_Dialog") を実行し、ダイアログを取得する

    5A.もし ダイアログ.location.href=="about:blank" ならば、
    window.open(http://ドメインB/ページB2.html?key=123456789)

    5B.もし、5Aでなければ、ダイアログ.SetKeyFunction(123456789)
      

    こんな形です

    こちらで、いろいろと練っているうちに条件が次のように整理できました
    (上記質問文からは抜き出せないものです すみません)

    ・ダイアログ側のページを再リロードさせない

    ・ダイアログ側は初期起動のときだけは、クエリ値で渡したい

    ・ダイアログ側を呼び出すページは複数存在する

    ・呼び出し側ページでは、ダイアログ側の、クエリ値を含むURL、を取得できない(ドメイン制約)

    ・ダイアログ側と同ドメインに、仲介するページをつくればよいのではないか?

    といった具合に、結論に至りました
    アンカー値はサーバーに送られないため、
    i4ooonさんの方法は、残念ながら使えませんでした

    しかし、大変参考になりましたので重ねて御礼申し上げます。
    ありがとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません