来自控制器的CSRF令牌

Pie*_*NAY 3 csrf symfony-forms symfony

我有一个控制器发布表格.

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

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

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

我只需要阅读它

$form->get('_token')
Run Code Online (Sandbox Code Playgroud)

这告诉我

儿童"_token"不存在.

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

Pie*_*NAY 8

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

$token = $request->get($form->getName())['_token'];
Run Code Online (Sandbox Code Playgroud)

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

$csrf = $this->get('form.csrf_provider');
$intention = $form->getName();
$token = $csrf->generateCsrfToken($intention);
Run Code Online (Sandbox Code Playgroud)

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

小智 5

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

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

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

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

$token = $this->tokenManager->getToken('myformname')->getValue();
Run Code Online (Sandbox Code Playgroud)