サーバーサイドから値をブラウザにそのまま表示させるとjavascriptなど不正なコードを実行してしまう危険性があるため、前もって値をサーバー側でサニタイズする必要があります。
そこでコントロール側のプログラムでset時に毎回サニタイズするのはアホらしいのでsetメソッドをオーバーライドして、意識しなくても自動的にサニタイズされるようにしました。
/cake/libs/controller/app_controller.phpを以下のように編集。
class AppController extends Controller { /*setメソッドをオーバーライド*/ public function set($var, $val = null, $sanitize = true) { if ($sanitize) { $val = $this->__sanitize($val); } return parent::set($var, $val); } /*サニタイズメソッド*/ private function __sanitize($dat){ if (is_array($dat)) { foreach ($dat as $cnt=>$val) { $dat[$cnt] = $this->__sanitize($val); } return $dat; } else { return htmlspecialchars($dat); } } }
逆にset時にサニタイズしたくない場合は3番目の引数にfalseを指定すればそのまま出力してくれます。
$this->set('auth',$this->Auth->user(),false);