CakePHP の暗黙なサニタイズ
ひとつ重要な事実があります。
実は CakePHP は、データの永続化( INSERT, UPDATE ) に際して PreparedStatement を使用していません。
PreparedStatement はインジェクションに代表される SQL をターゲットとする攻撃を防止する最も簡単にして強力で確実な技術でした。しかし CakePHP では PreparedStatement を使用せず、攻撃やメタ文字に注意しながら、 SQL の全文を自分( CakePHP の DB ライブラリ)が作ってサーバに投げています。明確な理由はわかりませんが、デバッグ情報として実行した SQL の全文を出力したいのかもしれません。
このように、 CakePHP ではデータを暗黙のうちにサニタイズしています。タイミングは次の2カ所です。
- モデルとデータベース間
前述の通り CakePHP では各 RDBMS ごとに、もっとも好ましいであろう手段でデータをサニタイズします。たとえば MySQL では、データを mysql_escape_string 関数に通してから SQL 文を作ってサーバへ送信します。 - HTML ヘルパー
データ入力画面などのテンプレート HTML を出力する際には、 HTML ヘルパーを用いて form タグを出力すると思われます。このような用途を見越してか HTML ヘルパーでは form 関連タグの value 属性の値を htmlspecialchars() 関数に通してから出力します。また HtmlHelper::tagValue() メソッドでも htmlspecialchars() 関数を通してから値を出力します。この振る舞いは入力データの確認画面で恩恵が得られることと思います。( tagValue メソッドは第二引数を true に設定しないとエスケープしなくなりました)
« 「モデルの動的なアソシエーション」へ | トップへ | 上の階層へ | 「CakePHP の理解を深めるためのメソッド」へ »
