3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(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クラスについては下記参照。

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)はバリデート使ってるときはやめた方がいい!?を参照。