第1回 [これはひどい]IEの引用符の解釈

はせがわようすけ
ネットエージェント株式会社

2009/2/27

XSSにCSRFにSQLインジェクションにディレクトリトラバーサル……Webアプリケーションのプログラマが知っておくべき脆弱性はいっぱいあります。そこで本連載では、そのようなメジャーなもの“以外”も掘り下げていきます(編集部)

小さな話題が面白い

- PR -

 皆さん、はじめまして。はせがわようすけと申します。

 「教科書に載らないWebアプリケーションセキュリティ」ということで、Webアプリケーションのセキュリティに関連する、普段あまり見掛けないような小さな話題を取り上げていきたいと思います。

 セキュアなWebアプリケーションを実現するために、開発者の方だけでなく、Webアプリケーションの脆弱性検査を行う方々にも読んでいただきたいと思っています。重箱の隅を楊枝でほじくるような小さな話題ばかりですが、皆さんよろしくお願いします。

 さて第1回は、Internet ExplorerがHTMLを解釈する際の引用符の扱いについて説明します。

属性値の引用符は1つだけじゃない

 皆さんご存じのとおり、HTMLを動的に生成するWebアプリケーションにて属性値を出力する場合には、クロスサイトスクリプティング(XSS)への対策として、

  • 属性値そのものを引用符「"」でくくる
  • 属性値に含まれる引用符「"」はエスケープして、「"」のように文字実体参照などで表す

とするのが定石だと思います。

 もちろん、引用符としてダブルクオーテーション「"」ではなくシングルクオーテーション「'」を使う場合もあるでしょうが、原則としては同じように属性値を引用符でくくることと属性値内の引用符をエスケープする、の2点につきると思います。

 ただし、2種類の引用符を混在させることは、コードを書く際にも混乱によるミスを生じかねないので、どちらかに統一するべきでしょう。

 例えば<input>要素のvalue属性を出力する場合に、

<input type="text" value=[ここに外部由来の文字列]>

という形でvalue属性を引用符でくくっていなかった場合、攻撃者は「x onmouseover=alert(/xss/.source)」のような文字列を与えます。すると、生成されるHTMLは、

<input type="text" value=x onmouseover=alert(/xss/.source)>

のようになり、テキストボックス上でマウスカーソルを動かしたときに攻撃者のJavaScriptが実行されてしまい、XSSが成立してしまいます(ユーザーによる操作の介在なしにスクリプトを実行させる手段もありますが、それについてはここでは触れません)。

【TIPS!】
alertのカッコ内「/xss/.source」は、引用符を使わずに任意の文字列を表現する、攻撃者にしか役に立たないテクニックの1つです。

 また、value属性を引用符でくくっていても、属性値内に含まれる引用符をエスケープしていない場合、つまり、

<input type="text" value="[ここに外部由来の文字列]">

のような状況だと攻撃者が「x" onmouseover="alert(/xss/.source)」という文字列を与えることで、

<input type="text" value="x" onmouseover="alert(/xss/.source)">

のようなHTMLが生成され、XSSが成立してしまいます。

 繰り返しになりますが、HTMLの属性値を生成する場合には、

  • 属性値そのものを引用符でくくる
  • 属性値に含まれる引用符はエスケープして、「&quot;」のように文字実体参照などで表す

というのが大原則です。

 
1/3

Index
[これはひどい]IEの引用符の解釈
Page1
小さな話題が面白い
属性値の引用符は1つだけじゃない
  Page2
IEに存在する“第3の引用符”
何が問題なのか
  Page3
セキュリティ上の問題
これは脆弱性ではないのか

教科書に載らないWebアプリケーションセキュリティ

 Coding Edgeお勧め記事
いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(1)
 コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう
Zope 3の魅力に迫る
Zope 3とは何ぞや?(1)
 Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか?
貧弱環境プログラミングのススメ
柴田 淳のコーディング天国
 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く?
Haskellプログラミングの楽しみ方
のんびりHaskell(1)
 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう
ちょっと変わったLisp入門
Gaucheでメタプログラミング(1)
 Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう
  Coding Edgeフォーラムフィード  2.01.00.91

TechTargetジャパン

Coding Edge フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH