日経ネットワークセキュリティ「自己防衛マニュアル」(2003年8月発行),156ページより

(注:記事は執筆時の情報に基づいており,現在では異なる場合があります)

自動生成するJavaScript対策

リスト2●ユーザーの入力値を制御できないWebページの例
図5●リスト2のWebページが悪用され得る理由
Webブラウザからスクリプト送ると(左),それがそのまま動く(右)
写真14●写真9の例でJavaScriptのエスケープ処理をしたところ
入力データを変数の値として使う場合に,入力された「’」「”」「¥」をエスケープすることがセキュリティ対策となる
写真15●HTMLエンコードも効果はあるが文字化けが発生する
写真16●数字のデータとして利用する場合はJavaScriptのエスケープ処理は効果がない
リスト3●写真16のソースコード
リスト4●リスト3に対策を施したコード。
Webブラウザから渡されるクエリー文字列の値が数値かどうかのチェックを1行目のIsNUmeric関数が行っている
写真17●リスト4のWebページに不正なクエリー文字列を入力したところ

 では,クライアント側スクリプトに対して,どのような無効化処理やエスケープ処理が有効なのかを考えていこう。その前に,注意してほしいのは,以下で述べるセキュリティ対策は,あくまで変数の初期値として利用する場合に限定されているということである。

 例えば,リスト2[拡大表示]のようなWebページを考えてみよう。リスト2を見れば分かるが,Webブラウザからポストされる「cCode」という値が,test関数の内部処理となるように設計されている。しかし,このプログラムを作成したプログラマの想定したコードだけが送られてくるわけではなく,Webブラウザから与えられるデータは,いかようにも書き換えが可能だ。このことは説明済みである。つまり,リスト2では任意のデータを送り込むことができ,それがクライアント側のコードとして実行される(図5[拡大表示])。これを防ぐ手立てはないと言ってもよいだろう。ということで、ここでの対策方法の話は、あくまでも変数の初期化の値として利用する場合に限定していることに注意してほしい。

 クライアント側スクリプトの代表はJavaScriptだろう。JavaScriptでのエスケープ処理は,以下のようになる。

「’」→「¥’」
「”」→「¥”
「¥」→「¥¥」

 Webブラウザから渡されるデータをクライアント側スクリプトの変数の初期値として利用する場合,上記のようなエスケープ処理を実施することで,この部分のクロスサイト・スクリプティング問題を回避することができる。クエリー文字列に前述した不正なコードを入力しても,「’」を「¥’」に置換することにより,スクリプト・コードが動作しなくなる(写真14[拡大表示])。

 Webや書籍では,クロスサイト・スクリプティング問題の対策として,「”」を「"」,「’」を「'」に置換する方法を紹介している場合が多い。この対策も有効ではある。しかしこの対策だと,写真15[拡大表示]のようにクエリー文字列に「sanaki’」という値を入力すると,文字化けが発生する。前述のエスケープ処理なら,文字化けすることなくデータを扱えるようになる。

 では,数値として利用する場合はどうだろうか。クライアント側のJavaScriptであっても,数字については「’」や「”」で囲む必要は必ずしもない。データの先頭と最後を「’」や「”」という文字で特定するわけではなく,上記のエスケープ処理は効果を持たなくなる(写真16[拡大表示],リスト3[拡大表示])。

 ということになれば,Webブラウザから渡されるデータをこのような個所で用いる場合は,数値かどうかを判断する必要があるだろう(リスト4[拡大表示],写真17[拡大表示])。

*            *            *

 今回は,プログラム例や不正行為例の紹介よりも説明が多くなってしまった。クロスサイト・スクリプティング問題で大切なのは,「クロスサイト」「スクリプティング」という名前(カタカナ)に惑わされないこと。適用範囲がSI業者の開発した独自のWebアプリケーションからWebサーバーまで広範囲だと認識すること。この問題の本質は,あなたと関係のない第三者が,あなたのWebサイト/WebアプリケーションのHTML出力を書き換え可能だということである。さらにあまり紹介されていないクライアント側スクリプトを動的に生成する場合の注意点が伝われば,筆者としては幸せである。

佐名木 智貴 Sanaki Tomoki

筆者はインターナショナル・ネットワーク・セキュリティに勤務。技術本部に所属している。システムのセキュリティ・ホールの検査を専門とし,システム開発のセキュリティ問題に詳しい。