ikepyonのだめ人間日記

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

果たして入力検証は有効なのか?

おとついあたりから考えているのだけど、本当にWebアプリのセキュリティ対策として入力検証は必要なんだろうか?
多くのWebアプリはphpJavaPerlといった言語で書かれている。このためCに特徴的なBuffer Overflowの脆弱性というのはあまり考えられないので、データ長を入力時に確認する必要性というのがないといえるんじゃないかな。それ以外のチェックとなるとあまり必要性を感じないと言うか、設計で回避できそうな気がする。

入力検証が必要そうなものとして考えられるのが、hiddenやselect、option、Cookieだろう。
これらは、サーバからデータを渡されるが、それらが改ざんされてサーバに渡される可能性がある。それらを検出するために入力検証は必要といわれるが、しなかった場合どうなるのだろう?
hiddenやCookieに価格情報などを格納しているのは全てセッション変数に格納しても問題ないはずだ。問題あるとすれば、hiddenやCookieの値をJavascriptで使用している場合と、セッションIDぐらいだろう。後は、セッション変数という概念がない環境もそうだけど・・・
最もセッションIDはフレームワークなり、ミドルウェアなりが吸収してくれるので、アプリ開発の場合に検証が必要と言うことは少ないと思われる。また、Javascriptで使用している場合、多分多くの場合は、その値を使って表示を変えるとか、Javascript内部での処理を変えるといった事が多いだろうから、脆弱性につながるということは少ない気がする。

一方、select、optionはどうか?というと、これらの値を配列の添え字としてそのまま使っている場合、添え字を負の値にしたり、定義しているより大きな数を入れたりすると実行時にエラーが発生し、場合によっては情報漏えいにつながるだろう。それ以外にももしかしたらあるかもしれないが、実際のところ、エラー処理をしっかりしていれば、意外と問題ないような気がする。

そうやって考えていくと、実は、入力検証がセキュリティ対策としてあまり有効ではないかもしれないように思うようになった。
実際、XSSSQLインジェクションと言った脆弱性は、エスケープ処理が適切になされていないためだしなぁ。

しかし、こんなこと書いても二番煎じだなorz

まあ、入力検証は手っ取り早く直すのには楽だなぁ。

そういえば、値のnullチェック、パラメータの存在チェックは入れておいたほうがいいかもしれない。環境場合によってはエラーとなることあるし・・・まあ、エラー処理がしっかりしていればこれも問題ないんだけど・・・