【问题标题】:How to render CSRF input in twig?如何在树枝中呈现 CSRF 输入?
【发布时间】:2018-08-14 16:33:45
【问题描述】:

我知道使用form_rest 呈现 CSRF 令牌隐藏输入的常用方法,但有没有办法呈现 CSRF 输入本身?我在主题中覆盖了{% block field_widget %} 以呈现一段额外的文本。但是由于 CSRF 令牌也在输入字段中呈现,并且我在隐藏字段旁边得到了一段我不需要的文本。所以我想用一个参数单独渲染它,告诉它不要渲染这个文本。

【问题讨论】:

    标签: php symfony csrf twig


    【解决方案1】:

    你可以用{{ form_widget(formView._token) }}做到这一点

    【讨论】:

      【解决方案2】:

      如果你有 formView 对象,你可以使用 Twig 函数渲染它:

      {{ form_widget(formView._token) }} 
      

      如果你还没有 - 你可以在不直接使用表单对象的情况下渲染令牌:

      <input type="hidden" name="token" value="{{ csrf_token('some-name') }}">
      

      适用于 Symfony 2.x 和 3.x

      要验证令牌,您可以在控制器 (Symfony 3.x) 中使用以下代码:

      $submittedToken = $request->request->get('token');
      
      if ($this->isCsrfTokenValid('some-name', $submittedToken)) {
          // ... do something,
      }
      

      【讨论】:

      • 很高兴知道,有时这是非常有用的功能
      • 对不起,对我不起作用 :( 我得到“CSRF 令牌只能在 FormRenderer::__construct() 中注入 CsrfTokenManagerInterface 时生成。”在 Symfony 3.1 中。但是哪个 FormRenderer?我不知道'不想使用任何形式。
      • 这在 Symfony 3.2 中适用于我。不过,您声明 'authenticate' 应该是表单名称。我不认为这是真的。如果您使用它进行登录,它应该始终是 'authenticate'。检查official docs
      • @NiketPathak 谢谢,用新信息更新了答案
      【解决方案3】:

      或者你可以简单地使用这个:

      {{ form_row(form._token) }}
      

      这将根据您使用的表单类型自动生成正确的隐藏 HTML 元素,即正确的 HTML 结构和字段名称。

      【讨论】:

        【解决方案4】:

        我需要在 Twig 中呈现 csrf 输入,以便我可以将其用于 删除 操作。 根据@YuryPliashkou 的回答使用{{ csrf_token('authenticate') }} 给了我不正确的令牌(仅对登录有效!)

        对我有用的是这个 {{ csrf_token('form') }},它为我提供了正确的 csrf 令牌,然后我将通过 ajax 将其传递给我的控制器。

        <span id="csrf_token" data-token="{{ csrf_token('form') }}"></span> 
        // my ajax call
        $.ajax({
            url: localhost/admin/product/4545,   // 4545->id of the item to be deleted
            type: 'POST',
            data: {
                "_method": "DELETE",
                "form[_token]": $("#csrf_token").data("token")   // passed csrf token here
            },
            success: function(result) {
                // Do something 
           }
        });
        

        验证了它在 Symfony 3.x 上的工作。

        Reference

        【讨论】:

          【解决方案5】:

          没有找到适合我的解决方案,在示例中找到并测试并为我的 Simfony3 value="{{ _token }}" 工作

               <form name="form" method="post" action="{{ path('blog_show', { 'id': blog.id }) }}">
                 <input name="_method" value="DELETE" type="hidden">
                 <input class="btn btn-danger" value="Delete" type="submit">
                 <input id="form__token" name="form[_token]" value="{{ _token }}" type="hidden">
              </form>
          

          更多关于 scrf 的信息可以在这里查看:Creating forms manually in Symfony2, but still use its CSRF and isValid() functionalily

          【讨论】:

            猜你喜欢
            • 2013-08-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-16
            • 2021-04-21
            • 2019-05-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多