第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の属性値を生成する場合には、
- 属性値そのものを引用符でくくる
- 属性値に含まれる引用符はエスケープして、「"」のように文字実体参照などで表す
というのが大原則です。
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の世界を体験してみよう |
|
TechTargetジャパン
- 実例で学ぶRailsアプリのテスト方法 (2011/12/22)
具体的なWebアプリを例に簡単なテストを使ったリファクタリングについ
て解説する - Railsの人気テストフレームワーク6選! (2011/8/18)
今回からテストを使ったリファクタリングを解説する。まずはRailsで人
気のあるテストフレームワークをいくつか紹介する - ActiveRecordの更新系操作 (2011/6/27)
Railsのモデル層を担当するActiveRecordを使った登録、更新、削除
など、更新系の機能を中心に見ていきます - 実例アプリで学ぶ“Railsらしさ”の基礎 (2011/5/26)
Ruby on Railsで書かれた実例アプリを取り上げて、初心者が陥りがちなコードの書き方を指摘します。より「Railsらしい」コードとは?
|
|

