コントローラで追加、更新、削除のアクション用のフィルタを作成して、それらが自動的にチェックされるかどうかを確認したい
- GETやその他のメソッドではなく、POSTで呼び出されました
- ビューのフォームに設定したpageInstanceIDを持っています
- xssから保護します
- フォームの二重送信から保護します
- 送信ボタンからダブルクリック
- 提出後に押された戻るボタンから
- 保存またはブックマークされているURLから
現在、AppControllerを使用して\ lithium \ action \ Controllerを拡張し、そこで追加、更新、および削除のアクションを定義しています。AppControllerには、適切なpageInstanceIDがセッションにあるかどうかをチェックするブール関数もあります。
以下は私のコードです:
public function isNotPostBack() {
// pull in the session
$pageInstanceIDs = Session::read('pageInstanceIDs');
$pageInstanceID = uniqid('', true);
$this->set(compact('pageInstanceID'));
$pageInstanceIDs[] = $pageInstanceID;
Session::write('pageInstanceIDs', $pageInstanceIDs);
// checks if this is a save operation
if ($this->request->data){
$pageInstanceIDs = Session::read('pageInstanceIDs');
$pageIDIndex = array_search($this->request->data['pageInstanceID'], $pageInstanceIDs);
if ($pageIDIndex !== false) {
// remove the key
unset($pageInstanceIDs[$pageIDIndex]);
Session::write('pageInstanceIDs', $pageInstanceIDs);
return true;
}
else
return false;
} else {
return true;
}
}
public function add() {
if (!$this->request->is('post') && exist($this->request->data())) {
$msg = "Add can only be called with http:post.";
throw new DispatchException($msg);
}
}
次に、コントローラーでAppControllerから継承し、次のようなアクションを実装します。
public function add() {
parent::add();
if (parent::isNotPostBack()){
//do work
}
return $this->render(array('layout' => false));
}
これにより、フォームがPOSTを使用し、二重に送信されていないことが保証されます([戻る]ボタンまたは[ハッピーユーザー]をクリックします)。これは、XSSからの保護にも役立ちます。
このためのプラグインがあることは知っていますが、コントローラーメソッドがよりクリーンになるように、これをフィルターとして実装したいと思います。このように、私のアクションのコードは//dowork部分とreturnステートメントだけです。