(CakePHP)Sanitize::clean($this->data)はバリデート使ってるときはやめた方がいい!?
(CakePHP)$form->textareaはサニタイジングしてくれない!?の追記で $this->data 全体をSanitize::cleanしてましたが、どうやらこれはバリデート使っている時はまずいみたいです。
たとえば、バリデートでメールのチェックを定義し、Sanitize::clean($this->data) にします。
そして、「-」付のメールアドレスを入れます。
そうすると、先にサニタイジングが走るので、- が 45; となります。
そして、$Model->Save 時にバリデートで 「&」 とか 「#」 とかがチェックに引っ掛かりそこで処理が止まってしまうわけです。
なので、結局各モデルの個別のフィールドごとにサニタイズするようにしました。
そして、メールアドレス等バリデートしてるところは、 Sanitize::html($string , true ) でhtmlタグを削除します。
( Sanitize::html() についてはhttp://book.cakephp.org/ja/view/462/html参照)
このやり方はあまりスマートでないので好きじゃないのですが、解決策が見つかるまで当面この方法でやることにしました。
//モデルclass Member extends AppModel {
//バリデーションの定義。
var $validate = array(
//氏名
'fname' => array(
'between' => array(
'rule' => array('between', 1, 50 , ) , //1-50文字
'allowEmpty' => false, //空の値を許さない
'message' => '氏名は1-25文字の範囲で入力してください。', //エラー時にhelperが出すメッセージ
),
),
//氏名カナ
'kana' => array(
'kanjiChk' => array(
'rule' => array('custom', '/^(?:\xE3\x82[\xA1-\xBF]|\xE3\x83[\x80-\xB6])+$/'),//'/^[ア-ヶ]+$/') , //半角文字以外(全角ONLY)
'allowEmpty' => false, //空の値を許さない
'message' => '氏名カナは全角カタカナで入力してください。', //エラー時にhelperが出すメッセージ
),
'between' => array(
'rule' => array('between', 1, 50 , ) , //1-50文字
'allowEmpty' => false, //空の値を許さない
'message' => '氏名カナは1-25文字の範囲で入力してください。', //エラー時にhelperが出すメッセージ
),
),
//メールアドレス
'mail' => array(
'rule' => 'email' , //メールの書式
'allowEmpty' => false, //空の値を許さない
'message' => '正しいメールアドレスを入力してください。', //エラー時にhelperが出すメッセージ
),
//電話番号
'mem_tel' => array(
'rule' => array('custom', '/\d{2,4}-\d{2,4}-\d{4}/') , //電話番号の書式
'allowEmpty' => true, //空の値を許す
'message' => '正しい電話番号を入力してください。', //エラー時にhelperが出すメッセージ
),
//FAX番号
'mem_fax' => array(
'rule' => array('custom', '/\d{2,4}-\d{2,4}-\d{4}/') , //FAX番号の書式
'allowEmpty' => true, //空の値を許す
'message' => '正しいFAX番号を入力してください。', //エラー時にhelperが出すメッセージ
),
);
}
//コントローラ
function index(){
...
if (empty($this->data))
{
//初回アクセス時
$this->render();
}
else
{
//2回目以降のアクセス(POSTデータがあったアクセス)
//モデルにPOSTデータセット
$this->Member->set( $this->data );
$this->Order->set( $this->data );
$this->_sanitize();
....
}
}
/**
*/
function _sanitize(){
App::import('Sanitize');
$this->data['Member']['name'] = Sanitize::clean($this->data['Member']['name']);
$this->data['Member']['kana'] = Sanitize::clean($this->data['Member']['kana']);
//mail,tel,faxは Sanitize::html を用いる
$this->data['Member']['mail'] = Sanitize::html($this->data['Member']['mail'], true);
$this->data['Member']['tel'] = Sanitize::html($this->data['Member']['tel'], true);
$this->data['Member']['fax'] = Sanitize::html($this->data['Member']['fax'], true);
$this->data['Member']['addr'] = Sanitize::clean($this->data['Member']['addr']);
$this->data['Order']['note'] = Sanitize::clean($this->data['Order']['note']);
}