当前位置: 首页 > 知识库问答 >
问题:

Zend framework 2-csrf在刷新时重新生成

邢起运
2023-03-14

我有一个Zend框架2 formElement csrf的问题。

它工作正常,直到我提交一个无效的表单,点击同一页,然后刷新页面。字段上出现"not The相同"验证错误,并出现消息"提交的表单不是来自预期站点"。这是正确的,因为如果我检查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保护中找不到我的解决方案

共有1个答案

爱炯
2023-03-14

我也经历过类似的问题。在我的例子中,我使用了带有Zend\Authentication\Validator\Authentication验证的登录表单。验证程序在每次验证尝试时都会销毁会话,因为它使用了Zend\Authentication\AuthenticationService和默认的Zend\Authentication\Storage\session存储。由于csrf值存储在会话中,使用验证程序会导致scrf值被破坏,因此每次尝试登录表单后都必须重新创建该值。

因此,我的建议是:尝试检查会话是否在刷新期间没有被销毁(不应该)。这个参考可能有帮助:http://framework.zend.com/manual/2.2/en/modules/zend.session.config.html

 类似资料:
  • 目前,我的页面上有表单,无论用户是否登录,表单都存在。用户登录后,会向他们显示其中一个表单(使用CSRF)。 问题是,如果在身份验证之后出现此框,则CSRF令牌将无效。我已经确认了这一点,允许我自己提交表格,而无需验证检查和

  • 问题内容: 这是一个非常基本的问题-但我无法通过在线搜索找到答案。 我正在使用python控制ArcGIS,并且有一个简单的python脚本,该脚本调用了一些预先编写的代码。 但是,当我对预写代码进行更改时,它似乎没有导致任何更改。我导入了此模块,并尝试刷新它,但是没有任何反应。 我什至将它调用的文件移到了另一个位置,脚本仍然可以正常工作。昨天我做的一件事是我将所有python文件都添加到sys路

  • 问题内容: 我正在尝试创建一个非常简单的Swing UI,以在后台进行处理时通过JTextArea将信息记录到屏幕上。当用户单击按钮时,我希望每个呼叫都能够: 立即显示在用户界面中 目前,在单击按钮后处理完成之前,JTextArea不会显示所有日志信息。如何获得动态刷新? 问题答案: 我的应用程序遇到了同样的问题。我的应用程序有一个“运行”按钮,它执行一些操作并将结果输出到JTextArea。我不

  • 问题内容: 如果将新文档索引到Elasticsearch索引,则可在索引操作后1秒钟左右搜索新文档。但是,可以通过调用或对索引进行操作来强制使该文档可立即搜索。这两个操作之间有什么区别- 结果似乎对他们来说是相同的,可以立即搜索文档。 这些操作中的每一项到底是什么? ES文档似乎并未深入解决此问题。 问题答案: 您得到的答案是正确的,但我认为值得详细说明。 刷新有效地调用了Lucene索引读取器上

  • 我正在使用spring quartz job连接到Redis来执行操作。我已经将RedisTemplate配置为只连接到主节点。 我希望获得一致的数据,这就是为什么我希望使用master进行读写,使用slave进行冗余和故障转移。 两天来我一直在思考这个问题。任何帮助都是非常感谢的。

  • 编辑:当我拖动边框时,某种刷新被发送,我需要弄清楚并手动发送相同的刷新。 请注意,我已经尝试使用revalidate()和repaint()。 当使用JFrame和JPanel来显示一个框架时,我试图使框架的大小易于改变。 null 此外,一个重要的注意事项是,当您拖动边框时,白条会消失,并正确地重新加载/刷新内容(即使您只是少量拖动)