本文介绍了如何检查Symfony2中提供的CSRF令牌是否无效?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个Symfony2表单并将其绑定到请求。在继续处理表单的其余部分之前,我需要明确确保CSRF令牌是否有效。

I have created a Symfony2 form and bound it to the Request. I need to explicitly ensure whether the CSRF token is valid/invalid before proceeding with the rest of the form.

$ form ['_ token'] -> isValid()抛出 OutOfBoundsException 并显示消息 Child _token不存在。

$form['_token']->isValid() throws OutOfBoundsException with message "Child _token does not exist."

我仍然可以验证呈现的表单是否包含 _token 字段。如果CSRF值无效,则 $ form-> isValid()返回false。

I can still verify that the rendered form contains _token field. In case that CSRF value is invalid, $form->isValid() returns false.

我是什么

更新1:

控制器(部分) ):

private function buildTestForm() {
    $form = $this->createFormBuilder()
            ->add('name','text')
            ->getForm();
    return $form;
}

/**
 * @Route("/test/show_form", name="test.form.show")
 * @Method("GET")
 */
public function showFormTest()
{
    $form = $this->buildTestForm();
    return $this->render('TestBundle::form_test.html.twig', array('form' => $form->createView()));
}

/**
 * @Route("/test/submit_form", name="test.form.submit")
 * @Method("POST")
 */
public function formTest()
{
    $form = $this->buildTestForm();
    $form->bind($this->getRequest());
    if ($form['_token']->isValid()) {
        return new Response('_token is valid');
    } else {
        return new Response('_token is invalid');
    }
}

模板

{# Twig template #}
<form action="{{ path('test.form.submit') }}" method="post" {{ form_enctype(form) }}>
    {{ form_widget(form) }}
    <input type="submit" name="go" value="Test Form" />
</form>


推荐答案

没有书面方法可以手动检查csrf令牌。 Symfony自动验证此令牌的存在和准确性。

There is no documented way to check csrf token manually. Symfony automatically validates the presence and accuracy of this token. http://symfony.com/doc/current/book/forms.html#csrf-protection

但是有一个csrf提供程序:

However there is a csrf provider:

如果您想保护表单提交免受CSRF攻击,则
可以提供一个意图字符串。这样,您可以确保
表单只能绑定到设计用于处理该表单的页面,即
,即使用相同的意图字符串通过isCsrfTokenValid验证CSRF令牌
的页面()。

If you want to secure a form submission against CSRF attacks, you could supply an "intention" string. This way you make sure that the form can only be bound to pages that are designed to handle the form, that is, that use the same intention string to validate the CSRF token with isCsrfTokenValid().

您可以像这样检索提供程序

You can retrieve the provider like this

$csrf = $this->get('form.csrf_provider');

然后可以使用

public Boolean isCsrfTokenValid(string $intention, string $token)

Validates a CSRF token.



返回值布尔值浏览器提供的令牌是否正确

Return Value Boolean Whether the token supplied by the browser is correct

您需要找出表单使用的意图字符串。

You need to finde out the intention string used by your form.

SO上一些有趣的帖子:

Some interesting posts on SO:

这篇关于如何检查Symfony2中提供的CSRF令牌是否无效?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-12 09:52