cakephp1.1系の$html->textareaについて

最近、初めてのPHPフレームワークとしてcakephpを使い始めた。とてもシンプルでわかりやすくサイトを構築できて、とても気に入っている。しばらくはサンプルに毛が生えた程度のものを作って動かしていたけど、慣れてきたのでそろそろ一般に公開するサイトに仕上げようと思い、セキュリティ関連の対策を確認してみたところ、いきなり落とし穴にハマった。

ハマったのは、データを編集するフォーム(例えば/news/editとかみたいな)。HTMLヘルパーはとても便利で、ビューで$html->input()$html->textarea()等としていれば、コントローラから渡される$this->dataの値をそれぞれの要素の値に入れてくれる。だけどその値は当然htmlspecialchars()というかh()でescapeかけてからそれぞれの要素の中に入れ込んでいるだろうと思っていたら、確認してみればびっくり、textareaにおいてはそういう気を利かせてくれないようだ。これはちょっといろいろ困る。1.2系では修正されているのかも知れないが、現時点での安定版ということで1.1.18.5850を使っているので、HTMLヘルパーに手を加えることにした。HTMLヘルパーは/cake/view/helpers/html.phpにあるけど、/app/view/helpers/html.phpにコピーして編集するのが無難みたい。

<?php
//  /app/view/helpers/html.php 234行目ぐらい

//$value = $this->tagValue($fieldName);
$value = $this->tagValue($fieldName,
      isset($htmlAttributes["escape"])?$htmlAttributes["escape"]:true);

?>

これでデフォルトでescapeされるようになる。特別に、escapeしたくないときは、ビューで

<?=$html->textarea("News/edit",array("escape"=false))?>

と明示すればOK。