著作一覧 |
どうもサイトがなくなってしまったようだが、ADxMenu.jsというのを仕事で利用している。
で、httpsな環境で利用して、かつそれがhttpなバックエンドに対してリバースプロクシでつながっていると、保護された項目と保護されていない項目の混在ダイアログの原因となっていた。
いろいろ調べるとADxMenuは次のコード
document.write("<script id=__ie_onload defer src=javascript:void(0)><?/script>");
を利用して、body.onloadと同じようなタイミングで実行するスクリプトを制御しているわけだが、それが引っかかっているのだった。
「mootoolsでIE+SSLではまった」というページでmootoolsのコードが出ているが、大体、これと同じ問題だ。
もっともADxMenuは問題点を認識していて、document.location.protocolがhttpsであればsrc="//0"に変えようとしている。それは良いのだが、リバースプロクシのほうはhttpにしていたので、document.locaion.protocolはhttpだったのであった。そこで、常にsrc="//0"にするように変えたのだが、疑問がたくさん。
まず、ADxMenuが利用している"//0"というURLだが、これは何なのだろう? 同じプロトコルの0ってことは、https://0.0.0.0ということかな?
他にも探すと"://0"を利用(lightboxがSSLで警告)とか"//:"を利用(mt.jsが原因でSSL接続にならない場合)などのバリエーションがある。なんか、//0の書き間違えのような気もするが、うまく動いているのだろうから構わないとは思うが気になる。IEはデフォルトルートを無視という(良く知られた)仕様があるのかなぁ。
とりあえず、良くわからないまま、ADxMenuの元のコードに合わせて"//0"としてうまく動いている(本当にうまくかどうかがわからないので、ここに書いているのだが)ので、放置しているのではあるが、やはり気になる。
たとえば、このおかしなURIが原因で、IEが100ミリ秒ほど余分なurlmon問い合わせとかしているのなら、それはやめさせたいわけだし。
about:blankがhttpsとそれ以外の混在チェックに引っかからないのは確認している。ポップアップやIFrameの開始時のURLに利用して問題ないからだ。その意味では、about:blankを使うほうが良いようにも思うのだが(追記:とは言い切れない。たとえばポップアップであれば、submitの結果のスクリプト内でabout:blankをポップアップすることは可能だったがスクリプトだけで自動的にポップアップさせようとするとブロックされたのを思い出した(けど、これはURLは関係ないね)。将来的な変更に耐えうる一番良い方法は、最初にリンクした人のように小さなHTMLを用意してそれを呼び出すことだと思える)、わざわざADxMenuの作者がhttpsなら//0と書いているくらいなのだから、何か正当な意味があるかも知れず、しかし、「//0」は検索語ではない(やり方知らないだけかも)ので出所も見つからず、ちょっと気持ち悪い感じ。
ジェズイットを見習え |
> about:blankがhttpsとそれ以外の混在チェックに引っかからないのは確認している<br><br>IEのバージョンに依存しますよね。IE6とIE7で扱いが違ったように思います。<br>おそらく、バージョンまで限定した話を書かれているんだと思いますが、誤解する人がいるかもしれません。
う、そうなんですか? というのは、IE6とIE8で試しているんですが、どちらも見た目は問題ないので。週明けにもセキュリティセッティングを確認してみます。
気付きましたが、ifrmaeはともかくポップアップの初期アドレスがabout:blnakだというのはmixed contentsは無関係ですね。iframeも無関係なのかな(それはそれでまずい気もするけど)。
http://trac.dojotoolkit.org/ticket/427 こんなの見つけたけど、IE6より前かな?
IE6 では insecure 扱いでした。<br>http://tracker.moodle.org/browse/MDL-12561?page=com.atlassian.jira.plugin.system.issuetabpanels%3Acvs-tabpanel<br>とか<br>http://blogs.msdn.com/ieinternals/archive/2009/06/22/9797918.aspx<br>IE6, we treat "about:blank" as insecure content, as well as "javascript:" and "res:". In IE7, we fixed the "about:blank" case, but we have not (yet) changed javascript and res.<br>とか<br><br>少なくとも2008年7月頭の段階で、最新パッチがあたったIE6はinsecureとして扱っていたはずです。最近は確認していませんが。
ところで 0 は 0.0.0.0 と同じですので、自ホストを意味します。ADxMenuってのは知らないんですが、ローカルに動いているサービスならば https://0.0.0.0:... でも繋がることは繋がると思います。Windows上で、SSL証明書の扱いがどうなるかは知りませんが...
どうもありがとうございます。IE6の最新SPなし(2008夏状態)で試してみないとだめですね(それはすごく厄介)。<br>src="//0" はクライアントサイドスクリプトで実行されるので、それが自ホスト=クライアントマシンとなると、通常はport unreachableが返り、しかし可視化されるわけではないので無視、ということになるのかな?(でもそれだとクロスドメイン違反(元のサーバとMy Computer)となりそうだけど、見た目はうまく動いているのが不思議)
iframeで別のドメインを表示しているだけならクロスドメインにならないのではないでしょうか。iframe先が、クッキーその他、親ページの情報へのアクセスを試みるとまずいわけですが、port unreachableなら、親ページへのアクセスを試みてるはずがないので、https混在チェックに限れば問題ないように思います。まあ、そもそもhttps://0/にアクセスするということ自体が問題だとは思いますが。
ちょっと書き方がまずかったみたいですね。最初に立ち戻ると、<script src='javascript:...'>がmixed content警告になるために、src='//0'に変えて解消するということだったわけです。というか、書いていて自分で気づきましたがクロスドメイン云々ではなくて、プロトコル混在が問題だからhttps://0は問題ないわけですね(いや、問題あると思うので、解決策は小さなhtmlをホストに置いておいてそれにアクセスさせることだろうかなぁ(無用トラフィックは出るわけだが))。
http://0は、おそらくロングIPアドレスってやつですね。
お、そういう呼び名があるんだ(で、検索したら、なるほど引っかかりまくる)。ありがとう!