ikepyonのだめ人間日記

セキュリティに関することを書いていく予定。

入力検証と出力時のエスケープ処理

まあ、これらを適切に行っておけば、ほとんどの脆弱性は防げるはず。
詳しくは、以下のAppendix Cを読んでもらえば、その理由はわかるんじゃないかな?
http://isecom.securenetltd.com/spsmm.0.5.1.jp.pdf
で、入力検証は、信頼できないものからの入力で必要となるんだが、この信頼できないものというのは、ユーザからの入力だけでなく、ファイルやDB、環境変数と言ったほとんど全ての入力なんだよねぇ。てか、信頼できないる入力というのがあるのか?と言われるとまあ、システム時計のフォーマットぐらい?と言うぐらいほとんどないんじゃないかと思われ。
信頼できない入力を信頼できる入力にするための方法の一つが入力検証だと思っている。
入力検証はアプリの仕様に依存するので、検証内容は設計時に決められるだろう。

しかし、Webアプリの場合、どうしても、入力時に検証できない場合もあるだろう(例えば、全てのデータを受け付けるような仕様の場合が考えられる。Cの場合は必ず入力文字数のチェックをしないといけないけどね)し、入力検証で許可したものが出力時の相手先のプログラムで悪影響を出すこともあるだろう。
そういったときの対策というか当たり前の処理として、エスケープ処理があるのだと思う。
エスケープ処理は、出力先のプログラムの仕様に依存する(DBならSQL文の、ブラウザならHTMLとかJavascriptとか)ので、やはり設計時に決められるだろう。こっちの処理はアプリの仕様に依存しないのでライブラリ化できるし、そういった安全なライブラリが実際存在する。こういうのをきちんと使えば安全なんだけど、適切に使われていないのが現状だったりするし、場合によってはそういったライブラリが使えない場合もある。特にXSSなんかは、入力データを出力のどこに入れるかによってその対策が異なってくるので、非常に難しい。特にJavascriptのコード内に入れる場合は注意が必要だったりするんだよねぇ。

と書いてみたけど、落ちが無いw