読者です 読者をやめる 読者になる 読者になる

ウェブサービスを作っています。

CakePHP の Controller::set()

ビューにデータを渡すメソッドですが、全くサニタイズされないようなので、AppController でオーバーライドして使っています。

<?php
/**
 * 自動サニタイズ機能付き set() メソッド
 *
 * @param string  $var      セットする変数名
 * @param mixed   $val      値
 * @param boolean $sanitize サニタイズするかどうか
 * @return mixed  parent::set()呼出結果
 * @access public
 */
function set($var, $val, $sanitize = true)
{
    if ($sanitize) {
        $val = sanitize($val);
    }

    return parent::set($var, $val);
}

で、どこかで sanitize() 関数を定義しておきます。
もしくは、コンポーネントかなんかのメソッドで。

<?php
/**
 * htmlspecialchars() を再帰的に実行する
 *
 * @param mixed $dat 対象データ
 * @return mixed サニタイズされたデータ
 */
function sanitize($dat)
{
    if (is_array($dat)) {
        return array_map('sanitize', $dat);
    } else {
        return htmlspecialchars($dat);
    }
}

モデルの findAll() と find() もセキュリティ上問題あるので、オーバーライドしておきたいと思っていたりします。