【问题标题】:Symfony: make CSRF token available to all twig templatesSymfony:使 CSRF 令牌可用于所有 twig 模板
【发布时间】:2017-11-20 16:01:31
【问题描述】:

我的应用到处都有 AJAX 请求,我想用 CSRF 令牌保护它们。但是,与其生成 CSRF 令牌并将其传递给 Twig 渲染器以在 JavaScript 中使用,我希望 CSRF 令牌在 Twig 渲染的每个 html 页面中都可以轻松使用。

我看到 Laravel 似乎把它放在一个元标记中,所以我可以很容易地用 JavaScript 抓取它。但是如何在 Symfony 中做到这一点?如何在每个页面中插入此令牌?

或者这不是好习惯?

【问题讨论】:

  • 你为什么需要这个?
  • 我需要它来保护我的 AJAX 请求
  • 找到了,我可以将tokenmanager作为twig全局变量插入config.yml中,然后从模板中调用tokenmanager

标签: symfony twig csrf


【解决方案1】:

当然这是个好习惯!!

为此,您在 symfony/twig 中有内置函数 csrf_token('key')

例子:

<a href="{{ path('product_remove', {id: product.id, csrf: csrf_token('product') }) }}" 
   class="btn btn-info">Remove</a>

从控制器中,您只需检查它:

/**
 * @Route("/product/remove/{csrf}/{id}", name="product_remove")
 */
public function removeProductAction($csrf, $id)
{
    if ($csrf !== $this->get('security.csrf.token_manager')->getToken('product')->getValue()) {
        throw new InvalidCsrfTokenException('Invalid CSRF token');
    }

    // delete $id

    // cleans up url
    return $this->redirectToRoute('product_list');
}

【讨论】:

  • noooo~ 你是认真的吗?我整个下午都在网上搜索,并认为插入服务然后调用它非常聪明。原来我所要做的就是在 Twig 中调用 csrf_token() 。不知道我是怎么错过的。 rar 所有的东西。编辑:我的意思是谢谢!
【解决方案2】:

答案:将其作为 twig 全局变量插入,然后使用 Javascript 将其绑定到所有请求。

config.yml

twig:
    ## ...
    globals:
        csrfTokenManager:  '@security.csrf.token_manager'

base.html.twig

<script>
    $.ajaxSetup({
        beforeSend: function(xhr) {
            xhr.setRequestHeader('x-csrf-token', '{{ csrfTokenManager.getToken('ajaxAuth') }}');
    });
</script>

接收控制器

public function receiveAction (Request $request)
{
    $tokenManager = $this->get('security.csrf.token_manager');
    $tokenId = 'ajaxAuth';
    $token = new CsrfToken($tokenId, $request->headers->get('x-csrf-token'));

    if (!$tokenManager->isTokenValid($token)) {
        throw new HttpException(403, 'Go away h4x0r');
    }
}

【讨论】:

  • 可以在任何地方使用相同的token id吗?如果它在所有地方都相同,那么令牌 id 参数的意义何在?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2014-10-06
  • 2020-05-19
  • 2018-05-10
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多