- 2007-07-18 (水)
- 技術
ここが危ない!Web2.0のセキュリティで書かれていた内容が面白かったのでメモしておきます。
XSS(クロスサイトスクリプティング)は一般に広く知れ渡っているセキュリティホールですが、Ajaxを使った場合はさらにサニタイジングを意識しなければなりません。
例えば一般的にAjaxで通信する場合、~~.doや~~.cgiなどの動的プログラムを呼び出しますが、単純に~~.txt、~~.csvといったファイルを指定することも可能です。
この場合ファイルの中身は普通なテキストを想定していますが、HTMLタグやスクリプトが記述されていた場合にクライアント側で実行をしてしまうということです。
ということを回避するには、
- ファイルに対してアクセスさせない
- JavaScript側でdocument.writeをする前にサニタイジングを行う
といったことをしなければなりません。
JavaScript側でのサニタイジングを行うのは、ちょっと面倒なので、単純にファイルにアクセスさせないほうで実装したいもんです。
基本的にはクライアントにHTMLを返す直前でサニタイジングしたいですね。
Comments:2
- OKAMURA 2007-07-18 (水) 20:31
-
こんにちは、お久しぶりです。
お久しぶりでいちゃもんぽくって恐縮ですが、大事なことなので。
「ファイルであるかないかに関わらずサニタイズは意識しなければならない」 というのが要点です。
それは…
- 動的なリソース(CGIなど)が最初からサニタイズされたものを出力するのと、静的なリソース(ファイル)が最初からサニタイズされたものが書かれているのとは、取得する側にとっては同じ結果。
- 動的なリソースがサニタイズを必要とするものを出力するのと、静的なものがサニタイズを必要とするものが書かれているのとは、取得する側にとっては同じ結果。
- つまり動的か静的かに関わらずどのような内容が取得できるかにサニタイズの必要性は依存する。
- それは動的なリソースならその動作の仕様に依存し、静的なリソースならそれが作成/更新されるときの仕様に依存する。
ということです。更に言うと「AJAX であるかないかに関わらずサニタイズは意識しなければならない」です。
ユーザからのフォーム入力、URL のクエリ文字列という従来からの入力は一種の動的なリソースです。そしてそれはシステムの外部からやってきます。セキュリティ的にはサニタイズが必要なものが入っていると考えなければなりません。
AJAX という文脈で特に XSS に気をつけなければならないのは、URL のクエリ文字列など従来の入力に加えて、XMLHttpRequest で取得するものという新しい入力源が増えたということでしょう。
ですから、その増えた入力源がシステムの外部由来かどうか、そしてそれが出力する内容はどうコントロールされているか(ファイルならファイルに保存するときどうしたか、CGI なら元データをどう整形したか)、それを考えつつ必要なサニタイズを過不足無く行うというのが大切というわけです。
- Hisasann 2007-07-18 (水) 23:13
-
>OKAMURAさん
おおっ!お久しぶりです。
移転前のBlogではお世話になりました。XSSのお話ありがとうございます。まったくもってその通りですね。
クライアントからのクエリをサニタイズするときは特にSQLインジェクションに気を使っています。基本はバインド変数を使っているので問題はないですが…XSSに関しては、クライアントに返す直前でサニタイズし、XSS要素が含まれる文字列をエスケープしているので、とりあえずは安全に感じます。
ただし、ファイルに直接アクセスとなるとそのファイルのデータをサニタイズする処理がサーバー側でラッピングできないため、あまりよい手段とは言えないと考えています。ラッパー経由にならないならJavaScript側でサニタイズするしか方法がないかな~と。
まぁファイルに直アクセスはないとは思いますが…OKAMURAさんの仰るとおり、基本どんな通信方法でもサニタイズすることは大切ですね。逆にどんな通信方法でも基本は同じだから難しくなるということもなさそうです。
追伸:
移転してきて始めて技術的なコメントをいただきました。
本当にありがとうございます!
Trackback:0
- TrackBack URL for this entry
- http://hisasann.com/cgi-bin/mt/mt-tb.cgi/229
- Listed below are links to weblogs that reference
- Ajaxでのクロスサイトスクリプティングで気をつけたいこと from HouseTect, JavaScript Blog


