【问题标题】:CSRF protection, error if turned on, error if turned off?CSRF保护,开启错误,关闭错误?
【发布时间】:2021-10-06 06:39:26
【问题描述】:

我正在开发一个 Web 应用程序,当我提交表单时遇到问题,它显示 CSRF 保护错误,这不是问题,因为我不需要此表单(不包含敏感数据,我已实现只有具有某些特权(角色)的用户才能访问此页面)。

我的问题是,当我在 FormType 选项中使用 'csrf_protection' => false, 时,我收到以下错误:缺少一些强制参数(“id”)来为路由“myroute”生成 URL

我不介意开启 CSRF 保护,但它在我的树枝中显示了这个丑陋的错误:

CSRF 令牌无效,尝试发送表单 aigan

是的,我知道上面的内容并不完全是它所说的,但我是从我的母语翻译过来的。

有人知道快速解决这个问题吗?

控制器功能

    /**
 * @Route("/{id}/edit", name="score_edit", methods={"GET","POST"})
 */
public function edit(Request $request, Duel $duel, DuelRepository $duelRepository): Response
{

    $form = $this->createForm(ScoreType::class, $duel);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $this->getDoctrine()->getManager()->flush();

        return $this->redirectToRoute('score_edit');
    }

    return $this->render('score/edit.html.twig', [
        'duels' => $duelRepository->findAll(),
        'duel' => $duel,
        'form' => $form->createView(),
    ]);
}

表单类型

    class ScoreType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('puntenP1', TextareaType::class, [
                'label' => 'Punten',
                'attr' => array('style' => 'height: 25px;')
            ])
            ->add('eerstenP1', TextareaType::class, [
                'label' => 'Eersten',
                'attr' => array('style' => 'height: 25px;')
            ])
            ->add('puntenP2', TextareaType::class, [
                'label' => 'Punten',
                'attr' => array('style' => 'height: 25px;')
            ])
            ->add('eerstenP2', TextareaType::class, [
                'label' => 'Eersten',
                'attr' => array('style' => 'height: 25px;')
            ])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Duel::class,
            //csrf protection not needed for "scores"
            //'csrf_protection' => false,
        ]);
    }
}

树枝文件

   {{ form_start(form) }}

<div class="row">
    <div class="col">
        <p><b>Partuur 1</b></p>
        {{ duel.team1 }}
    </div>
</div>

<div class="row">
    <div class="col">
        {{ form_row(form.puntenP1) }}
        <p>Huidig: {{ duel.puntenP1 }}</p>
    </div>
</div>

<div class="row">
    <div class="col">
        {{ form_row(form.eerstenP1) }}
       <p>Huidig: {{ duel.eerstenP1 }}</p>
    </div>
</div>
<hr>
<div class="row">
    <div class="col">
        <p><b>Partuur 2</b></p>
        {{ duel.team2 }}
    </div>
</div>

<div class="row">
    <div class="col">
        {{ form_row(form.puntenP2) }}
        <p>Huidig: {{ duel.puntenP2 }}</p>
    </div>
</div>

<div class="row">
    <div class="col">
        {{ form_row(form.eerstenP2) }}
        <p>Huidig: {{ duel.eerstenP2 }}</p>
    </div>
</div>
    {{ form_widget(form) }}

    <button class="btn btn-success" style="margin-top: 10px">{{ button_label|default('Save') }}</button>

{{ form_end(form) }}

【问题讨论】:

  • 总是包含足够的代码来理解实际发生的事情(比如这里的控制器和表单声明,也许还有一个 Twig 模板)。第一个说你正在生成一个没有id 组件的路由,这看起来不像CSRF,第二个你可能没有在表单中包含(Twig?){{ csrf_token('form') }} 调用。时间有点久了,具体记不太清了。另外,CSRF 与登录用户一起使用,因为它使用他们的会话来提交请求,因此当有人登录时禁用 CSRF 是荒谬的,而且数据的敏感性也并非总是重点。
  • 感谢您的评论,我更新了我的帖子
  • {{ form_widget(form) }}{{ form_end(form) }} 之间尝试{{ csrf_token('form') }},不要禁用它。您也可以查看浏览器源代码,看看是否包含令牌的输入字段。
  • 添加确实提供了 csrf 令牌,所以我不明白为什么它会说它无效
  • 您明白您的“缺少 id”错误与 csrf 无关吗?返回并关闭 csrf,然后按照答案将缺少的 id 添加到重定向中。你应该得到一个干净的帖子和重定向。然后退后一步,也许完全创建一个不同的表单,并找出你的 csrf 配置被破坏的原因。一次处理一个问题。

标签: symfony symfony-forms symfony-security


【解决方案1】:

这是导致问题的代码:

return $this->redirectToRoute('score_edit');

您将用户重定向到该路由,不带参数,但该路由具有必需的参数:

@Route("/{id}/edit", name="score_edit", methods={"GET","POST"})

您必须将所需的参数添加到您的路线:

return $this->redirectToRoute('score_edit', [
    'id' => $duel->getId(),
]);

【讨论】:

  • 很奇怪看到一个带有特定 CSRF 相关标题的问题通过特定于路由的答案来解决。你也知道如何解决 CSRF 问题吗?
猜你喜欢
  • 2011-10-23
  • 2023-03-08
  • 2017-07-05
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 2015-04-20
相关资源
最近更新 更多