ここのリンク先に、PHPを使う上での注意として
「SQL文に変数を埋め込むときにはプレースホルダを使う(PDOのprepareとbindParams)」
とあります。
たとえばCakePHPにはプレースホルダがないように思うのですが、Cakeを使うと穴ができてしまうのでしょうか。それともCakeのORマッパー自体にプレースホルダの機能があり、それで十分なのでしょうか。
http://d.hatena.ne.jp/cakephper/20090417/1239939705
このような記事も見つけました。
Cakeのqueryメソッドで値をbindできるらしいのですが、記事中段のあたりに
「Cakeが自前でやってる擬似バインドです。」
とあります。
疑問点をまとめると、
1.CakeのORマッパーでSQLインジェクション対策として十分なのか
2.それともCakeのqueryメソッドのbindを使う必要があるのか
3.queryメソッドでも擬似バインドであり、やはり対策として不十分なのか
4.プレースホルダの機能がないCakePHPを使うと、穴が残るのか。具体的にどのような穴が残るのか。
となります。疑問点がすべて解消されるとうれしいのでお礼ポイントを300ポイントほど用意しておきます。
1.CakeのORマッパーでSQLインジェクション対策として十分なのか
不十分です。
O/Rマッパーはインタプリタに過ぎないので、インジェクション対策の対症療法にしかなり得ない。
2.それともCakeのqueryメソッドのbindを使う必要があるのか
3.queryメソッドでも擬似バインドであり、やはり対策として不十分なのか
4.プレースホルダの機能がないCakePHPを使うと、穴が残るのか。具体的にどのような穴が残るのか。
queryもbindも不十分です。
そして、マルチバイト文字を使っている場合はプレースホルダにしても不十分です。
なぜなら、バインド変数としてエスケープ記号を含むシフトJIS文字(十など)が入ってきた場合、想定外のエスケープ処理が行われるためです。
携帯電話サイトなど、設計上、シフトJISを使わざるを得ないシステムでは、自力でエスケープ処理するメソッドを用意してやる必要があります。
現実問題、プレースホルダだけを用いて開発するのはかなり制限がかかるので
実際のWEBアプリ(PHP以外でも)開発では、それ以外の方法も使われています。
プレースホルダだけを使えばよいとか言うのは、原理至上主義者か現場の開発がわかっていない人たちだけです。
プレースホルダだけをつかっても、セキュリティーフォールは余裕でできます。
>プレースホルダの機能がないCakePHPを使うと、穴が残るのか。具体的にどのような穴が残るのか。
SQLを発行するところで、条件に入力値を用いるところは、入力した値がいかなる値であっても大丈夫のように
チェックすべきです。
確かに、プレースホルダを使えば、入力値に 名前 and ・・・というようにSQL文字を改変することは無理になって
安全です。守られるのはここだけです。
一般的な、「SQLインジェクション対策」をすれば問題ないんです。プレースホルダを使わなければならないという制約はないです。
>Cakeが自前でやってる擬似バインドです
そうです。
Cake以外のフレームワークでも擬似バインドのものはいろいろあります。
Javaとかでも擬似バインドのフレームワークは多いですが、問題なく使われています。
擬似バインドでもなんでも、SQL生成に使う変数をエスケープして文字エンコーディングに気を付ければ問題なさそう
というのがわかりました。
マルチバイト文字の問題はDB接続時の文字コードをUnicodeとすることで回避できそうです。
携帯サイトを作るときもDBに格納する文字コードはシフトJISじゃないものを使うのが良いと思いました。