当前位置: 首页 > 知识库问答 >
问题:

Symfony:使CSRF令牌可用于所有细枝模板

松增
2023-03-14

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

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

或者这不是一个好的做法?

共有2个答案

萧安怡
2023-03-14

答案是:将其作为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');
    }
}
仲孙焱
2023-03-14

当然这是一个很好的实践!!

在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');
}
 类似资料:
  • 我负责新项目Symfony 4.4 symfony new_项目——版本=4.4 然后呢 作曲家需要索纳塔项目/管理包 并得到错误 这里生成composer.json 什么版本兼容?我应该更改哪个供应商来安装sonata管理员?

  • 我有一个新的Symfony 3.0的奇怪问题。1安装。我用一个包含url和标题的表单PostType生成了一个新的CRUD控制器。没什么特别的。 表单按预期呈现。它包含我的url字段和标题字段。表单内部还呈现隐藏的输入字段_标记。 提交此表单时,我始终收到以下错误: 所以令牌被添加到表单中,它包含一个值,我有一个常量PHP会话cookie值,它只是使这个令牌无效。 我已经搜索了其他答案,但类似的问

  • 首先,我对Symfony 2是个十足的傻瓜。这个问题听起来很简单,如果我试着把一些背景放在为什么和如何需要这个问题上,它会开始变得混乱。 本质上,我创建了一个表单,我使用条令等手动处理、验证和插入表单。我在控制器操作中手动创建表单(它是根据从另一个对象检索的值动态构建的)。我想也许有更好的方法可以做到这一点,但由于我对Symfony还不熟悉,而且我已经用了好几天的时间拖网了,所以我找不到任何解决方

  • 问题内容: 我正在构建一个通过webservices与symfony2应用程序对话的移动应用程序,我找不到在特定控制器/操作上禁用csrf保护的方法 我想将注册数据发布到此操作并使用sf2表单验证。我没有在移动应用程序中致电该表格 无法在操作中更改容器参数,因为它是冻结参数而引发异常… 我不想禁用整个应用程序的表单保护 有什么线索吗? 谢谢 ! 更新:使用symfony 2.1.x 问题答案: 如

  • 我被用来在表单/字段中重新定义date_小部件。html。Symfony 2和3中的细枝文件,强制细枝生成的日期选择为法语顺序:日-月-年,代码如下: 现在有了symfony4.4,我在我的Linux工作站上自动获得了这个法国订单。但在生产服务器中,订单又是美国标准的:月-日-年。若我用上面的代码示例重新定义这个订单,我会在生产服务器上得到法国订单,但在我的工作站上得到美国订单。 两个系统都有ph

  • 本页描述了解释CSRF攻击的用例(16.1): https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html 但是,如果用户确实登录了银行的网站,那么邪恶的网站难道不可能发出GET请求以获取新的CSRF令牌,并在根本不需要用户的情况下撰写帖子吗? 答案必须是否定的,否则CSRF令牌将毫无用处,但我