http://slashdot.jp/askslashdot/comments.pl?sid=389009&cid=1290697

ここのリンク先に、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人5回まで
  • 登録:
  • 終了:2010/11/18 02:50:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:tasklight No.1

回答回数323ベストアンサー獲得回数40

ポイント35pt

1.CakeのORマッパーでSQLインジェクション対策として十分なのか

不十分です。

O/Rマッパーはインタプリタに過ぎないので、インジェクション対策の対症療法にしかなり得ない。


2.それともCakeのqueryメソッドのbindを使う必要があるのか

3.queryメソッドでも擬似バインドであり、やはり対策として不十分なのか

4.プレースホルダの機能がないCakePHPを使うと、穴が残るのか。具体的にどのような穴が残るのか。

queryもbindも不十分です。


そして、マルチバイト文字を使っている場合はプレースホルダにしても不十分です。

なぜなら、バインド変数としてエスケープ記号を含むシフトJIS文字(十など)が入ってきた場合、想定外のエスケープ処理が行われるためです。


携帯電話サイトなど、設計上、シフトJISを使わざるを得ないシステムでは、自力でエスケープ処理するメソッドを用意してやる必要があります。

id:dedara

マルチバイト文字の問題はDB接続時の文字コードをUnicodeとすることで回避できそうです。

携帯サイトを作るときもDBに格納する文字コードはシフトJISじゃないものを使うのが良いと思いました。

2010/11/14 15:05:40
id:k-tan2 No.2

回答回数401ベストアンサー獲得回数48

ポイント35pt

現実問題、プレースホルダだけを用いて開発するのはかなり制限がかかるので

実際のWEBアプリ(PHP以外でも)開発では、それ以外の方法も使われています。

プレースホルダだけを使えばよいとか言うのは、原理至上主義者か現場の開発がわかっていない人たちだけです。

プレースホルダだけをつかっても、セキュリティーフォールは余裕でできます。

>プレースホルダの機能がないCakePHPを使うと、穴が残るのか。具体的にどのような穴が残るのか。

SQLを発行するところで、条件に入力値を用いるところは、入力した値がいかなる値であっても大丈夫のように

チェックすべきです。

確かに、プレースホルダを使えば、入力値に 名前 and ・・・というようにSQL文字を改変することは無理になって

安全です。守られるのはここだけです。

一般的な、「SQLインジェクション対策」をすれば問題ないんです。プレースホルダを使わなければならないという制約はないです。

>Cakeが自前でやってる擬似バインドです

そうです。

Cake以外のフレームワークでも擬似バインドのものはいろいろあります。

Javaとかでも擬似バインドのフレームワークは多いですが、問題なく使われています。

id:dedara

擬似バインドでもなんでも、SQL生成に使う変数をエスケープして文字エンコーディングに気を付ければ問題なさそう

というのがわかりました。

2010/11/14 15:11:51
  • id:dedara
    終了処理が間に合わず、ポイント送信機能を使いました。
    よろしくお願いします。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません