blogPHPでWEB+DBシステムの開発をやっています。2分39秒@deprecatedこの情報はCakePHP1.2betaまでのものです。1.2RC1についてはこの方法は有効ではありません。1.2RC1からは比較演算子をキーに書くをどうぞ。CakePHPのモデルで検索条件を指定する場合は比較演算子に注意が必要です。検索条件では↓な感じで条件値の他にSQLの比較演算子を入れることができます。}}?>これを見ただけで分かる人はピンと来ますね。外部から送られてきた値に比較演算子が含まれていてもそれがそのままSQL文として動作してしまうわけです。これがマズそうな場面は色々あるでしょうけど、決定的なのがログイン画面です。例としてメールアドレスとパスワードで認証するアクションを見てみます。}?>まあありがちな処理だと思いますが、このアクションに[email=!=hoge@example.com&password=!=a]をPOSTすると↓のようなSQL文が発行されてしまいます。1これだとusers.emailにhoge@expample.com、users.passwordにaのどちらもが存在しなければログインする事が可能となります。ユーザ情報に登録されていなさそうな値を使えば誰でもログインが可能となります。他にも登録されているメールアドレスを入力して、パスワードだけ[!=]を使うという手もあります。これならユーザのメールアドレスさえ分かればどのユーザとしてもログインできてしまいます。この問題の対策は2つ+1つあります。findBy/findAllByを使うfindBy/findAllByを使うとこの現象は発生しません。先程のloginアクションを書き換えてみます。$conds['password']);これなら入力された比較演算子も文字列として処理されます。実はfindBy/findAllByでは内部的にこの処理を行ってます。それを自分でやってしまうというわけです。ここでのポイントは’=’の後ろにスペースを入れるという事です。これが無いと一部の演算子が有効となってしまいます。入力値を厳密にチェックするこれももちろん大事です。検索に使用する値が数値のみや日付形式といった制限がある場合はそちらのチェックでこの問題を防ぐことができます。to]といったキーワードも同様の問題をはらんでいます。child」とか)ので判別が難しいです。ちなみにこの問題が発生するのは比較演算子・キーワードが文字列の先頭になっている場合のみです。それ以外の箇所にある場合は問題ありません。find/findAllで検索条件に連想配列を使う場合は注意をこれは忘れるとインパクトがあるのでfind/findByfindBy/findAllByで検索する場合はくれぐれもご注意を。17:58>このアクションに[email=!=hoge@example.com&password=!=a]をPOSTすると↓のようなSQL文が発行されてしまいます。1このようなSQL文が発行されましたが・・・。22:36anonさん:こんにちは。[email=!=hoge@example.com&password=!=a]はPOSTリクエストのメッセージボディをイメージしています。フォームで言うとemailに[!=hoge@example.com]を、passwordに[!=a]を入力して送信した状態になります。#0...さてさてログインフォームの改善を続けます。次はセキュリティ関連。気になる点は以下の二つ。ログイン画面ってわけではないですが、パスワードを平文で保存しているのが不安。比較演算子インジェクションに注意やCakePHPガイドブックで言及されているとおり、条件を連想配列で渡す場合、比較演算子インジェクションに注意しなければいけません。