人気ブログランキング |
(CakePHP)$form->textareaはサニタイジングしてくれない!?
CakePHP1.2

CakePHPは基本的に $form->input 等でデータを入力するときは htmlspecialchars() でサニタイズしてくれます。
が、なぜかテキストエリアをする $from->textarea() だけはサニタイズしてくれません。
なので、容易にクロスサイトスクリプティング(XSS)されてしまいます。

ということで、ここここを参考にしてみましたが、1.2のせいなのかどうかわかりませんが、うまくいきません。

仕方ないので、コントローラ内でモデルにセットした後にh()でエスケープすることにしました。
( h() は htmlspecialchars() の省略形らしいです)
//ビュー
<?php 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クラスについては下記参照。
http://book.cakephp.org/ja/view/153/%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%B5%E3%83%8B%E3%82%BF%E3%82%A4%E3%82%BA-Data-Sanitization

追記2 2009/1/27
上の方法でもまずい場合があります。
詳しくは(CakePHP)Sanitize::clean($this->data)はバリデート使ってるときはやめた方がいい!?を参照。
by jehoshaphat | 2009-01-26 19:41 | PHP開発


<< (CakePHP)Saniti... AccessからSQL Ser... >>