ikepyonのだめ人間日記

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

なぜPHPアプリにセキュリティホールが多いのか? 第14回 減らないSQLインジェクション脆弱性

http://gihyo.jp/dev/serial/01/php-security/0014
かなりびみょ〜

チェックポイント:すべてのパラメータを文字列として取り扱っているか?

これはいいですよ。でも、

ところで,uid,gidが整数型であるなら整数型にキャストすればよいのでは? と考えられた方もいると思います。しかし,キャストする方法は2つの理由でベストプラクティスとは呼べません。

キャストした場合,不正な攻撃目的の入力が行われてもクエリエラーが発生しない可能性があります。攻撃目的の入力は検出できるほうが好ましく,文字列として扱えばクエリエラーで簡単に攻撃用の文字列が検出できます。またキャストを行うと,32ビットアーキテクチャのコンピュータでは符号付き32ビット整数となり,データベースが一般的にIDに利用する符号付き64ビット整数に比べ著しく狭い範囲の整数でしか正常に動作しません。

これはいただけない。別にキャストする必要性はないし、文字列として'でくくる必要はない。この例であれば、ただ単に数値かどうかを確認するだけでよい。たしかこのあたりの考察を昔徳丸さんがやってたな。
http://www.tokumaru.org/d/20070924.html#p01

$_POST['first_name']に「表」などの“\”を含む文字が指定されると

first_name = '表\'

エスケープ処理され,サーバ側ではSJISとして処理されます。この結果,2つ目のパラメータ($_POST['last_name'])でSQLインジェクションが可能になります。

いや、それってphpがヘタレなだけじゃ?他の言語ではこんな変なエスケープ処理しないはずだけど・・・ってかPHPでもやったっけ?