現在地 HOME > 掲示板 > テスト8 > 142.html ★阿修羅♪ |
|
Tweet |
(回答先: Re: テスト 投稿者 クエスチョン 日時 2004 年 10 月 24 日 13:30:59)
セキュアなWeb構築の秘訣〜クロスサイトスクリプティングは思わぬ個所に巣食っている(8)〜
http://itpro.nikkeibp.co.jp/members/NBY/Security/20040809/148390/
[2004/10/26] バックナンバー
自動生成するJavaScript対策
佐名木 智貴
日経ネットワークセキュリティ「自己防衛マニュアル」(2003年8月発行),156ページより
この連載のほかの回を読む
(注:記事は執筆時の情報に基づいており,現在では異なる場合があります)
自動生成するJavaScript対策
では,クライアント側スクリプトに対して,どのような無効化処理やエスケープ処理が有効なのかを考えていこう。その前に,注意してほしいのは,以下で述べるセキュリティ対策は,あくまで変数の初期値として利用する場合に限定されているということである。
例えば,リスト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
筆者はインターナショナル・ネットワーク・セキュリティに勤務。技術本部に所属している。システムのセキュリティ・ホールの検査を専門とし,システム開発のセキュリティ問題に詳しい。