【问题标题】:CSRF Token from the controller来自控制器的 CSRF 令牌
【发布时间】:2019-07-16 16:45:06
【问题描述】:

我有一个控制器正在发布一个表单。

public function myPostAction(Request $request)
{
    $form = $this->createForm('my_form', $my_object);
    $form->handleRequest($request);
#...

我可以看到我的 CSRF 令牌作为参数发布

my_form[_token] => lH38HTm5P0Cv3TOc4-9xi2COx-cZ670mpJ_36gR8ccI

我只需要阅读它

$form->get('_token')

这告诉我

子“_token”不存在。

我怎样才能得到这个令牌?

【问题讨论】:

    标签: symfony csrf symfony-forms


    【解决方案1】:

    这是我将同时使用的解决方法:

    $token = $request->get($form->getName())['_token'];
    

    我还偶然注意到用于生成令牌的intention 是表单名称

    $csrf = $this->get('form.csrf_provider');
    $intention = $form->getName();
    $token = $csrf->generateCsrfToken($intention);
    

    【讨论】:

    • 感谢您的解决方案。最后一行应该是 = 而不是 == (但我不能编辑它,因为编辑应该至少有 6 个字符:'()
    • 从 2.4 开始,您需要改用“security.csrf.token_manager”。对于意图/意图,您可能需要“表单”或“身份验证”。您可以在会话数据中看到意图是什么,它应该在 var/sessions 下,并且名称与您的 PHPSESSION cookie 值的名称相同。
    【解决方案2】:

    就像@Pierre de LESPINAY 所说,可以通过检索令牌管理器服务来做到这一点。

    这个服务也可以像这样注入到你的构造函数中:

    use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
    ...
    public function __construct(CsrfTokenManagerInterface $tokenManager)
    {
        $this->tokenManager = $tokenManager;
    }
    

    然后像之前演示的那样使用:

    $token = $this->tokenManager->getToken('myformname')->getValue();
    

    【讨论】:

      【解决方案3】:

      您可以通过以下方式获得它:

      $request->request->get('my_form[_token]');
      

      如果您没有禁用 CSRF 保护,它将自动应用和验证,您无需自行检查。

      【讨论】:

      • 感谢您的回答。 _token 不存在,my_form[_token] 存在。我已经成功使用自动令牌处理,但我需要明确获取此令牌以解决异步文档上传问题(以便能够在发布时将其收集回来)
      猜你喜欢
      • 1970-01-01
      • 2015-10-27
      • 2013-03-27
      • 2015-04-17
      • 2017-04-06
      • 1970-01-01
      • 2022-01-13
      • 2014-07-18
      • 2018-11-04
      相关资源
      最近更新 更多