ばけらさんの『W2Cマークアップエンジニア・ワーキンググループ 「マークアップエンジニアが知っておきたい3つの脆弱性」』を拝読して

いささか疑問符が


マークアップはきちんと
  • 属性値を引用符で括り、属性値中の引用符
    文字参照
  • #PCDATAの場合、< を文字参照
  • 使い分けるのは面倒なので、常に " と < を変換することにしても良い

常にValidなHTMLを出力すること!

うう。#PCDATAの場合には、 & もまた、文字参照にするべきでは?

追記:20091005

ばけらさんの、えび日記2009年10月1日付けにて補足の説明があります。すみません、ささいな反応に応答していただきましてありがとうございます。納得です。そもそも聴衆の皆さんの高いレベルを考えますと、正しいマークアップができて当然ですので、その上で、正しくないマークアップのうち、これこれこういうことで思わぬ障害が出ますよ、という点を強調してのご説明だったのでしょう。私がコンテキストを考えずに資料を読み違えておりました。申し訳ありません。

追記2:20091005

2009年9月現在の統計情報では、ブラウザのシェアにおいて、Netscape 4.7 が 0.02% NetScape 4.6 が 0.01% ほどあり、Netsscape 4 シリーズ全体で、約0.03%程度の使用頻度があるようです。Netscape 4 シリーズの利用者はとっくに絶滅していると思いましたが調べてみるとこの通りです。少々驚きました。なお、上のリンク先は常に最新情報になっているようですので、後日参照すると統計情報は変化しているものと思われます。申し訳ありません。
ちなみに、引退したoffice氏は、現役のころ、Netscape 4 シリーズを愛用していたようです。
閑話休題
そもそもNetscape 4 シリーズを使っている時点で、セキュリティ的にどうなんだろうと不思議に思うわけですが、ひょっとしたらユーザサイドの都合でどうしても欠かせないということも想定できるのかしらん? たとえば、視力障害のため補助に使っている愛用ユーティリティが新しいブラウザでサポートされていなかったりとか。なかなか利用環境の切り替えが難しいこともあるでしょうし。 心配ではあります。
上記のようなことを考え合わせた上で、あえて申し上げますが、すでにNetscape4シリーズは、XSS対策面で考慮するに値しないものと、個人的には、割り切って考えています。そうはいっても、歴史的経緯と申しますか、昔はこういう風に考えていたんだよ、という目論見で、ちょっとしたメモをここに書いておきたく思います。 私のようにいいかげんでなくて、完璧主義な方々ならば、XSS対策としてNetscape4シリーズを念頭において後方互換をきっちり考えたいということもあることでしょうし。前振りが長くてすみません。では本題を以下に。
ばけらさんの資料で、『 属性値を引用符で括り、属性値中の引用符を文字参照に 』 とあるのは、Netscape4シリーズのシェアを無視できなかった昔においては、ことXSS対策としての説明として考えると、補うべき点があります。くどいようですが、もちろん、現在においてばけらさんの資料に不備があるというわけではないことはいうまでもありません。正しいマークアップなのにJavaScriptが実行される余地があるというだけですので、ばけらさんの資料の流れのコンテキストとは異なる状況下におかれていますし、それをいうならIEのstyleのexpressionと同レベルのお話でもあります。具体的には以下の記述に関するお話です。


#PCDATAに限らず、属性値の中でも & は文字参照に (&amp;や&#38;などに) 変換する必要があります。そうしないと不正な実体参照が挿入されてinvalidになってしまうおそれがありますし、HTMLの話やプログラミングの話を書き込みたいときなどに "&" という文字列がうまく表現できなくなったりして困ります。

Netscape4シリーズにおいては、『JavaScript Entities』という非標準の実装がありました。属性値中に &{ Javascript-Statements }; が存在していると、Netscape4は、そのコードを実行するという機能です。どんな風にHTMLで使うかというと、たとえば以下のようなサンプルコードが考えられます。

<BODY BGCOLOR="&{prompt('color?');};">
このサンプルコードでは、ページ閲覧時に、JavaScriptのpromptで、背景色をユーザに指定させるということを意図しています。 実際に上のような簡単なものは使われなかったことでしょうが、たとえば、widthやheightなどを指定できるようにするといった説明もあるようです。
一見してわかるように、JavaScript Entities は、XSSアタックに使いやすいベクタです。このため、XSS脆弱性対策の必要性が叫ばれはじめたころ、各種アドバイザリの一部ではJavaScript Entitiesを防止するために、属性値中の & は文字参照にすべし、という認識があったようです。
私が上のことを意識し始めたのは、Gobbles という集団によるアドバイザリを読んだ頃からでしょうか。 それまでは、& を &amp; に文字参照することは、正しいマークアップのために必要だ、ぐらいにしか考えていなかったものです。
さて、現時点において、XSS対策において、 & を &amp; に文字参照する理由についてあれこれ考える人がいるかもしれませんけれども、以上書き留めたメモのような歴史的背景をも併せて知っているといいかもしれませんね。
申し遅れましたが、Netscape6シリーズ以後では、JavaScript Entitiesの機能は廃止されました。ですのでこの話題は本当に昔昔のお話なのです。
以上、駄文にお付き合いいただきまして、ありがとうございました。