(CakePHP)$form->textareaはサニタイジングしてくれない!?
CakePHP1.2
CakePHPは基本的に $form->input 等でデータを入力するときは htmlspecialchars() でサニタイズしてくれます。
が、なぜかテキストエリアをする $from->textarea() だけはサニタイズしてくれません。
なので、容易にクロスサイトスクリプティング(XSS)されてしまいます。
ということで、ここやここを参考にしてみましたが、1.2のせいなのかどうかわかりませんが、うまくいきません。
仕方ないので、コントローラ内でモデルにセットした後にh()でエスケープすることにしました。
( h() は htmlspecialchars() の省略形らしいです)
//ビューecho $form->textarea("Order.note", array("cols"=>"40" ,"rows"=>"5" , "label"=>"" ))?>
//コントローラ
//モデルにPOSTデータセット
$this->Order->set( $this->data );
//textareaはサニタイズされないので、手動でサニタイジング
$this->data['Order']['note'] = h($this->data['Order']['note']) ;
まあ、データはそのままで出力時にサニタイズするというアプローチもあると思いますが、今回は入力時にサニタイジングしてます。
追記: 2009/1/26
上で「 $form->input はサニタイズしてくれる」と書きましたが、試したところサニタイズしてくれませんでした。どうやら1.1とはさっぱし変わったようです。
結局 CakePHP の Sanitize::clean() を使うことにしました。
//コントローラ
//モデルにPOSTデータセット
$this->Order->set( $this->data );
App::import('Sanitize');
$this->data = Sanitize::clean($this->data, true);
$this->を丸ごとサニタイジングします。
なお、Sanitizeクラスについては下記参照。
追記2 2009/1/27
上の方法でもまずい場合があります。
詳しくは(CakePHP)Sanitize::clean($this->data)はバリデート使ってるときはやめた方がいい!?を参照。