IEの気持ちを知るためのブックマークレット(2)

前回の記事

予定はなかったのですけれども続編を。本日発見したことが個人的には大変に面白かったので。こういうのを面白がる人ってどれくらいいるんだろう?いないかもだなぁ。

IEの気持ちをわかる為のブックマークレット

前回はIE専用のこんなブックマークレットを作成してみたのでした。過去記事を参照して頂けると幸いです。

javascript:(function (){var d=document;var t=d.createElement('TEXTAREA');t.appendChild(d.createTextNode(d.documentElement.outerHTML));var r = t.createTextRange();r.execCommand('copy');})();

このブックマークレットの効能はというと、

  1. 好きなサイトの好きなページをIEで見る。
  2. ブックマークレット起動。
  3. その時点でのそのページのHTML構造をクリップボードにコピーしてくれる。
  4. 適当なテキストエディタにペーストする。
  5. ペーストしたHTMLソースとHTMLのソースを比べて楽しむ。【謎】

以上が効能です。IEはHTMLソースを読みます。そしてレンダリングするなりスクリプトを起動したりするわけです。で、レンダリングする際に、ソースに書かれていることをIEなりに理解・翻訳してからとなります。これがIEの気持ちの部分です。IEの気持ちを明らかにするのが本ブックマークレットの狙いです。IEの気持ちと大元のソースを比べると面白いことが時々ありそうだ、というのが主旨です。

今回のネタ:IEはこんなHTMLを読むとどうなるのか

さっそくですが以下のページをIEで読みます。If you cannot see "VULNERABLE" below, the browser is safe.とか表示されますが、ここではまだ気にしないで下さい。

上のHTMLソースは以下のようになっています。間違い探しではありませんが目を皿のようにしてみてください。なにか付け忘れていませんか?デモの為に、わざと忘れているのです。

<html>
<head>
</head>
<body>
  <p>If you cannot see "VULNERABLE" below, the browser is safe.</p>
  <div>
    <script src="indexvuln.js"
  </div>
  <p>I am able to parse text after the script tag above.</p>
</body>
</html>

欠落しているらしいのは7行目です。欠落のポイントは2点あります。最初のポイントは、<script src="indexvuln.js"です。最後に > がついていませんね。次のポイントですが、  </script> がありません。

※そもそもHTML4.01なのかどうか不明ですけれどもおそらくそれを意図しているのだろうと仮定しています。

第一の欠落は、script要素の開始タグが閉じていないことです。すなわち終了区切り子がありません。第二の欠落は終了タグが存在していないこととなります。

外部jsを呼ぼうとしているらしいのですがサッパリな状況であることが見て取れます。もしも外部jsが呼べた場合には、If you cannot see "VULNERABLE" below, the browser is safe.ではないことになります。IEでは確かに"VULNERABLE"という文字列は表示されません。いえ、あくまでもこのデモではIEについては脆弱性が発現していないということです。バギーはバギーなのですね。え?バギーなのかって?IEの気持ちブックマークレットでそのバギーさかげんを見てみましょう。ブックマークレットを発動してメモ帳などにクリップボードに採取されたIEの気持ちをペーストすると以下のようなものが。

<HTML><HEAD></HEAD>
<BODY>
<P>If you cannot see "VULNERABLE" below, the browser is safe.</P>
<DIV>
<SCRIPT src="indexvuln.js" div <>
  <p>I am able to parse text after the script tag above.</p>
</body>
</html>
</SCRIPT>
</DIV></BODY></HTML>

注目なのですが、上の「気持ち」では、6,7,8行目のp要素とbody要素の終了タグ、html要素の終了タグ、が小文字で書かれています。これは大元のソースで小文字であるものをそのままスルーで吐き出しています。本来、IEの気持ちにおいては、IEが理解できたタグは全て大文字に置き換えられます。小文字のままスルーされたという事実を考えますと、6,7,8行目のp要素とbody要素の終了タグ、html要素の終了タグは、IEにとって解釈不能・意味不明であったこととなります。

次に5行目を見てみましょう。こんなのがあります。

div <>

なにゆえ裸のdivがあるのか謎です。また、なにゆえエンプティタグ(<>)があるのでしょう。全くの謎です。ここではHTML4.01のつもりでいますが、SGML の短縮タグ機構が働いているのでしょうか。よくわかりません。裸のdivについては大元のソースにおける8行目の </div> の成れの果てだと推察されますが、理由は不明です。IEの気持ちとしては、無理やりdiv属性をscript要素開始タグの中にいれてしまったように見えるのです。そしてどういうわけか <> でもって欠落していたscript要素開始タグの終了区切り子の代替にしているのかもしれません。あるいは、私がそのように思っているだけでIEにはその意図はないのかもしれません。

とりあえずscript要素の開始タグがIEの気持ちとして完成したとしましょう。6行目7行目8行目は、スクリプト要素の中身です。IEはscript要素の終了タグがみつけられないと以下ずーっとscript要素の中身だとみなすような気がします。このことに近いことは以前、Studio Kamadaさんが指摘していました。でも手元ではJavaScriptのバグ表示が出ないのですよねぇ。なんででしょう?

IEの気持ちとしては、大元のソースを全部読んでしまいます。ところが期待していたscript要素の終了タグはとうとう見つけられませんでした。そこでIEは気を利かせて9行目にscript要素の終了タグを挿入します。 </SCRIPT> を大文字で作っています。

同様にしてIEはみつけられなかったdiv、body、htmlの各終了タグを生成挿入します。見つけられないといいましたがIEが勝手に?無視して6行目から8行目にあるのですけれど、まぁしかたがないですか。

というわけで、IEの気持ちがわかるブックマークレットを使うことでIEがいかにしてバギーな解釈をしてしまったのかがわかりました。本件では脆弱ではないにしろ。

Firefoxではどうか

先にご紹介した本日のネタのHTMLですが、Firefoxで訪問してみるとしっかり"VULNERABLE"と表示されます。なぜ"VULNERABLE"なのかは、一度忘れてください。

Firefoxで訪問した後にメニューバーからソース表示をしてください。以下のようになっていると思います。

<html>
<head>
</head>
<body>
  <p>If you cannot see "VULNERABLE" below, the browser is safe.</p>
  <div>
    <script src="indexvuln.js"
  ></script></div>
  <p>I am able to parse text after the script tag above.</p>
</body>
</html>

ソースにおける第一の欠落、script要素の開始タグが閉じておらず、終了区切り子がないこと、第二の欠落、終了タグが存在していないことが見事に補正されています。さすがはFirefoxですね。

Firefoxではメニューバーのソース表示ではサーバから渡されたソースを表示しているのではなく、Firefox査閲補正済みのソースを表示しているのです。よく知られた事実です。本当?

Firefoxはセキュリティ的に脆弱なのか

このデモサイトではFirefoxが脆弱であると主張しているようにみえます。言わんとしていることはわかります。勝手にブラウザが補正してくれるとサーバサイドでのXSS脆弱性対策が難しくなる、こういうことなのです。フィルター作成が難しくなるのですよね。この意味でFirefoxが脆弱であると主張しているのでしょう。

ブラウザとしてはひょっとしたら優良なブラウザであって、IEのようにバギーではないと思います。IEだって妙なものをいっぱい勝手に補正しているのですから、バギーですよね。あとは、XSS対策がしにくいかどうかなのです。Webアプリケーションを作成する人たちやサーバ管理者さん達に是非聞いて見たいところではあります。

おわび

本項はいつかこの日記で既に書いたことの焼きなおしです。見覚えのある人、すみません。前に書いたときよりも見通しが良いはずです。お許し下さい。

朝日新聞のバグ

以前から朝日新聞嫌いバッシングの潮流があるようですね。私なんかはむしろ読売を読んでいると死にたくなるほどイライラします。比較的に安心して読めるのは毎日か。たまに降参党機関紙白旗を読む機会があると結構楽しんだりします。「18へぇ」とか言いつつ。Web上の白旗は内容がないようなので興味なしです。このあたりにも党勢縮小の影は充分に出ていると思いますね。ついでながら一言。個人情報保護法についての各党の政策がどうなのかとかはなかなかWebではわかりません。各党としてはどうでも良いのでしょうか。官僚の思い通りに進んでいるのかもしれません。

脱線しました。本線へ戻ります。またもや間違い報道があったという、朝日新聞バッシング諸君への燃料投下を試みるテスト。ドキドキ

2005年2月27日づけ大阪本社版社会面で確認されているようですが、重大な間違いがありました。他の版でどうなのか、訂正報道があったのかについては「私は」確認が取れていません。以下に間違い内容を記しておきます。

朝日新聞>「ぺ・ヨンジュン」という誤植 --- 「ぺ」はひらがな

2月27日づけ大阪本社版社会面「日本人客おいで〜 / インド洋大津波2カ月」の中に。

すのものの「いろいろ」(その118)より引用させて頂きました。

ネタでした。すみません。無論私も朝日新聞社同様、一次情報源をしっかりと取材していないわけですから罪があります。日記で間違ったことを書いていることに気がついても放置してますし。