【问题标题】:Laravel post JSON using CSRF ProtectionLaravel 使用 CSRF 保护发布 JSON
【发布时间】:2016-03-30 12:59:42
【问题描述】:

我从 Laravel 5 开始,我想把所有事情都做好。 我正在用 Json 做“发布”,我想实现 CSRF 保护,但我不知道如何在我的 JSON 上做到这一点。 我看到了很多关于 AJAX 的示例,但我没有找到 JSON。

我需要手动为 person 或 laravel 自动设置每个令牌吗?

如何将令牌作为该 JSON 的参数传递?

那是我的 JSON:

{
   "foo":"bar"
}

这是我的控制器代码:

public function Register()
{
    $teste = Request::json()->all();
    return  $teste;    
}

我在中间件上使用了 Laravel 的所有默认保护。

【问题讨论】:

  • 如何将 JSON 发送到服务器? JSON 是一种数据结构,而 AJAX 是一种从 javascript 向服务器发送请求的方式。 AJAX 使用 JSON。
  • 在你的 JSON 中有一个参数 _token,它的值是 var token = "{{ csrf_token() }}"

标签: php json laravel


【解决方案1】:

我们在 Laravel 应用中也解决了这个问题。只需做以下两件事。

首先,在你的页面上创建 _token 变量,你甚至可以把它放在你的基本布局视图模板中:

<script type="text/javascript">
    var _token = '{{ csrf_token() }}';
</script>

然后,让每个 ajax 请求在您的 js 应用程序代码的开头(或在您开始使用 jquery 的 ajax 调用之前的任何位置)发布带有以下内容的 _token 变量:

$.ajaxSetup({
    data: { _token: _token }
});

只要您的请求都没有使用_token 索引,您现在应该将 csrf 令牌添加到您在应用中发出的每个 ajax 请求中。

【讨论】:

    【解决方案2】:

    您总是需要传递 CSRF 令牌,无论是使用 ajax 发布还是正常发布。这基本上是一项安全功能。

    Laravel 自动生成。

    您需要在页面上创建“_token”变量,您也可以在主模板中创建一次变量,然后您可以在整个项目中访问它:

    <script type="text/javascript">
        var secure_token = '{{ csrf_token() }}';
    </script>
    

    现在您可以在 ajax 调用中发送带有数据的令牌,如下所示:

    $.ajax({
        data: { _token: secure_token }
    });
    

    如果您通过表单提交发布任何数据,您可以像这样发布:

    <input type="hidden" name="_token" value="{{ csrf_token() }}">
    

    您应该始终将 CSRF 令牌与您在项目中进行的每个 ajax 请求或表单提交一起发布。

    【讨论】:

      【解决方案3】:

      从 Laravel 5 开始,默认的 csrf 中间件将检查名为 _token 的表单数据字段名为 X-CSRF-Token 的请求标头。

      如果您不发布表单数据(例如 json 或 xml),那么标题是最简单的选项。

      如果您使用的是 jquery,则可以通过将以下脚本标记添加到始终加载的模板来为所有 ajax 请求设置它,例如layout.blade.php

      <script>
          $(function(){
              $.ajaxSetup({
                  headers:{'X-CSRF-Token': '{{ csrf_token() }}'}
              });
          });
      </script>
      

      【讨论】:

        猜你喜欢
        • 2018-05-27
        • 2017-05-04
        • 1970-01-01
        • 2016-09-05
        • 2015-03-11
        • 2016-05-19
        • 2012-08-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多