ikepyonのだめ人間日記

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

初心者のためのWEBアプリのセキュリティ対策

http://ameblo.jp/yosswi/entry-10028788115.html
うーん、うーん、大筋は間違ってないんだけど、高木先生にサニタイズ脳と言われそう。

まず、入力時のチェックでタグの変換はダメですよ。これは、タグ変換をいらないところでやることによるバグの混入を防ぐためです。タグの変換は出力直前にしましょう。
あくまで、入力時のチェックは、数字しか入ってないかとか、許可されている文字だけで構成されているかとか、文字数が最大文字数を超えていないか、フォーマットが正しいものかといったことしかチェックしないようにしましょう。
これだけで、セキュリティの強度は大きく変わります(当然、許可されている文字に危険な文字が入るとダメなので、これだけではダメですが)。こういったことは、きちんとしたアプリケーションであればやっていて当然のことです。

次に、出力時のチェックで、SQL文の話がありますが、シングルクォートをダブルクォートに変換とありますが、これは、正しくありません。この変換をしてしまうと、問題が発生したり、誤ったデータを使ってしまうことになります。
正しくは、シングルクォート1個(')をシングルクォート2個('')に変換しないといけません。そうしないと思わぬバグが発生します。また、RDBMSによっては(多くのRDBMSが該当しますが)「¥」も「\\」に変換しないといけません。こうしないとSQLインジェクションを起こす危険性があります。
SQLを使うとき一番良いのはバインドメカニズムを使用することです。PHPでも、PHP5ならPDOを使えば標準で使用できます。PHP4の場合はライブラリを別途使わないとダメみたいですが。
但し、バインドメカニズムも万能ではなく、DBと処理系の文字コードが違う場合は問題が発生することがあります。とはいえ、手でエスケープ処理を行うより、漏れが発生しないため、セキュリティの強度はぐっと上がります。
XSS対策としてタグの変換というのだけでは不十分です。リンクにjavascript:alert(document.cookie);と入れると、ポップアップが出るように、タグを使わない方法がいくつもあります。なので、XSS対策は結構面倒です。
そのときそのときに応じたチェックなり、エスケープ処理が必要となります。
また、あげられている3つの方法ではセッションハイジャックは防ぐことは出来ません。
まあ、暗黙の了解で書いていないのかもしれませんが・・・
セッションハイジャックはセッション管理に使用されるセッションIDを盗む若しくは推測して、攻撃する手法なので、セッションIDを推測できないものにするということが対策となります(盗まれないようにという点については、XSS対策やSSLを使うことである程度防げます)。
今あるPHPJSPといったものではその言語、フレームワークがセッション管理機能を持っているので、そういったものを使っている限りにおいては、まず問題は発生しません。
しかし、独自でセッション管理を実装していると、簡単に推測されたり、問題が発生することがあります。
例えば、ミリ秒単位の現在時刻をMD5でハッシュ化したものをセッションIDとして使用していると、一見すると、ランダムに見えますが、同時にアクセスがあった場合、同じセッションIDが別のユーザに割り振られるなんてことがあるので、こういったものはセッションIDとして使用してはいけません。

とまあ、細かいツッコミを入れてみたけど、確かにプログラムが本職じゃない人にはセキュアプログラミングは難しいかもなぁ。誰でも簡単に安全なプログラムが書けるフレームワークがあればいいのかもね。ま、そういうのは幻想かもしれないけど・・・