1

我似乎无法让登录表单 CSRF 保护使用 Symfony 2.1 愉快地工作。

在 config.yml 中,csrf_protection 设置为 true。登录表单正在呈现一个名为“form[_token]”的隐藏输入。在 security.yml 中:

csrf_parameter: form[_token]
intention: authenticate

使用此配置,我可以毫无问题地登录。但是没有检查 CSRF 令牌。我通过在提交表单之前删除隐藏的输入字段来确认这一点:

<input type="hidden" id="form__token" name="form[_token]" value="9b2f5d5efabb938ff8d83c2c8318db1377a3ef16">

如果我将 csrf_provider 配置设置添加到 security.yml,我将无法再登录,收到错误“Invalid CSRF token”

csrf_provider: form.csrf_provider

我已经阅读了有关该主题的所有内容,但似乎没有任何内容可以正常工作-除了我在本文中阅读的内容:http: //henrik.bjrnskov.dk/symfony2-cross-site-request-forgery/。这些东西似乎被拉进了 Symfony 之友:https ://github.com/FriendsOfSymfony/FOSUserBundle/pull/469 ,我没有使用它。

该帖子指示您:

  • 在 loginAction 中手动生成令牌:

    $csrfToken = $this->container->get('form.csrf_provider')->generateCsrfToken('authentication');

  • 将其发送到视图

  • 并在表单中手动呈现

这很烦人。

问题基本上归结为 - CSRF 保护是否应该在 Symfony 2.1 中仅使用配置设置的登录表单起作用,还是我需要修改我的 loginAction 和模板才能使其正常工作?

4

2 回答 2

1

您将错误的参数传递给 generateCsrfToken() 方法。它应该是“身份验证”,而不是“身份验证” - 这就是您获得无效令牌的原因。执行以下操作以使其工作:

secured_area:
    pattern: ^/
    form_login:
        csrf_provider: form.csrf_provider
        csrf_parameter: _csrf_token

然后将以下值添加到登录控制器的响应中:

'csrf_token' => $this->container->get('form.csrf_provider')->generateCsrfToken('authenticate')

最后在您的模板中:

<input type="hidden" name="_csrf_token" value="{{ csrf_token }}" />

使用 Symfony 2.3.1 测试

于 2013-07-20T15:37:32.570 回答
0

我遇到了同样的问题 - 当我发布表单时,我收到“无效的 csrf 令牌”错误。

我发现每个请求的 PHPSESSID 都不同。这导致了问题,因为 csrf 令牌是使用该 cookie 内容生成的。

解决方法:设置 cookie_secure: false

在您的 config.yml 中,或者只是从配置中删除该行(这可以在 framework -> session 下找到)

默认(true)设置在google chrome中没有造成任何问题,但是mozzila和其他浏览器引发了这个错误。

于 2013-01-24T12:03:54.780 回答