續 Security Component

Security Component enable 了以後, 在 $form->end() 的時候會加一個 hash token. 這很容易理解, 就是用這個hash tag 證明這張表單的正確性. 但實際上這個hash 是如何產生?
API: http://api.cakephp.org/view_source/security-component/#line-612

簡明點說, 沒有timestamp , 但有form 的每一個field, field 的name attribute. 所以你不可以自己加 input tags. 例子:

<?php
//add.ctp
  echo $form->create('page',array('url'=>$this->here));
  echo $form->input('title');
  echo $form->input('check',array('type'=>'checkbox'));
?>

<?php
  echo $form->end('submit');
?>

便pass 不了有 security component 的 controller 了, 因為有一個field 不使用 $form->input()

第一眼看, 這樣沒有問題呀, 因為input 可以使用 $form->input(). 有很多設定(options)可以改變 input 的, div=>false, label=>false 等等. layout html 上應該沒有什麼限制

對, 所以我都只是找到一個情況會出亂子. 就是 checkbox:

<?php
$form->input('check',array('type'=>'checkbox'));
?>

會輸出兩個input tag, 一個hidden, 一個type 是checkbox. (v1.3 好像可以不輸出hidden field)

問題是, 兩個同一個name 的 input 會令某些 js validation framework 出亂子. 永遠都只看hidden 的 input tag (因為 hidden 又一定在前面, type=’checkbox’ 在後 ). 所以…改js validation

p.s. 最最後, 我發覺, 只要你的 input tag 不使用 data[model][name] 的方式命名. 便不會出現問題, 因為 security component 只找用這個方式命名的field 做 hash… 但 controller 的 $this->data 便不會出現這field (model 的validation 都不會經過..), 除非…

//controller.php
function beforeFilter() {
  parent::beforeFilter();
  //unsafe!!! check exact equals of model and field name before merge
  //記得對清楚 model 和 field name 才 merge..
  $this->data = array_merge($this->data,$this->params[model]);
}

我的 case 不合用了, 我只需要使用者check了就好, 不需要走進DB, 直接check 了就pass, 否則fail

p.p.s: http://en.wikipedia.org/wiki/Cross-site_request_forgery