Zend Framework 2 の formElement csrf に問題があります。
無効なフォームを送信し、同じページにアクセスしてページを更新するまでは問題なく動作します。フィールドで「 notTheSame 」検証エラーが発生し、 「送信されたフォームは、予期されたサイトから発信されたものではありません」というメッセージが表示され ます。csrf フィールドの値を確認すると、送信前の値とは異なるためです。
csrf フィールドを追加する前に、フォームは正常に機能していました。
次のようにcsrfフィールドを作成しています:
class SignupForm extends Form
{
public function __construct()
{
parent::__construct('signup');
$this->setAttribute('method', 'post')
->setHydrator(new ClassMethodsHydrator(false))
->setInputFilter(new InputFilter());
$this->add(array(
'type' => 'Zend\Form\Element\Csrf',
'name' => 'csrf',
'options' => array(
)
));
// I also add a couple of fieldsets after this
そしてビューファイルで:
<?php
$form = $this->form;
$form->setAttribute('action', $this->url('needfunding', array('action' => 'register')));
$form->setAttribute('class', "signup-form start");
$form->prepare();
echo $this->form()->openTag($form);
$applicant = $form->get('applicant');
?>
<?php $this->FormErrors($form); ?>
<?php echo $this->formRow($form->get('csrf')); ?>
(FormErrors は、フォーム メッセージを取得してスタイルを設定するビュー ヘルパーです)
私のコントローラーで:
public function signupAction()
{
$form = new SignupForm();
/* some unrelated code [...] */
$request = $this->getRequest();
if ($request->isPost()) {
$category_group_id = $request->getPost()->category_group;
$selected_categories = array();
foreach ($categories as $c) {
$selected_categories[$c->getId()]=html_entity_decode($c->getName());
}
$form->get('category')->setValueOptions($selected_categories);
$form->setData($request->getPost());
if ($form->isValid()) {
/* some unrelated code [...] */
return $this->redirect()->toRoute('signupconfirmation');
}
else {
}
}
return array('form' => $form, 'categories' => $ordered_categories);
}
私の質問は、フォームが有効ではなかったためにフォームページに戻ったときに csrf が再生成されるのはなぜですか?
PS: この投稿で解決策を見つけることができませんでしたZend Framework 2 CSRF 保護