Laravel 5 CSRF全局令牌隐藏字段,用于页面中的所有表单

rap*_*dko 26 php csrf laravel

我最近迁移到Laravel 5,现在每个帖子提交都会进行CSRF检查.我想要删除它,但我想遵循最佳实践,所以我会保持这种方式.

另一方面,我提交ajax请求时出现问题..我的页面有多个表单,有些提交甚至不是来自表单,只是简单的ajax调用.我的想法是在页面上有一个隐藏的"令牌"输入并将其附加到每个提交.拥有通用单一令牌输入有任何缺点吗?

另外,我该如何输出令牌?在页脚上创建一个隐藏的输入是否可以?

luk*_*ter 28

我没有看到任何缺点.您可以在布局文件中轻松创建全局标记字段:

<input type="hidden" name="_token" id="csrf-token" value="{{ Session::token() }}" />
Run Code Online (Sandbox Code Playgroud)

或者,如果您使用表单构建器:

{!! Form::token() !!}
Run Code Online (Sandbox Code Playgroud)

在jQuery中,你可以使用类似这样的令牌附加到每个请求.


Ard*_*rda 25

有一个帮助器可以在表单中添加表单令牌.你可以使用

{!! csrf_field() !!}
Run Code Online (Sandbox Code Playgroud)

在表格内.它将添加隐藏的输入和令牌.

  • 从Laravel> = 5.1开始,你不再需要使用原始输出,你可以使用常规的转义语法`{{csrf_field()}}` (3认同)
  • 从Laravel 5.6开始可以使用`@ csrf` (3认同)

tom*_*rod 6

你可以在页面底部使用这样的东西:

$('form').append('{{csrf_field()}}');
Run Code Online (Sandbox Code Playgroud)

这将为您的所有内容添加隐藏的输入forms:

<input type="hidden" name="_token" value="yIcHUzipr2Y2McGE3EUk5JwLOPjxrC3yEBetRtlV">
Run Code Online (Sandbox Code Playgroud)

对于你所有的AJAX请求:

$.ajaxSetup({
    beforeSend: function (xhr, settings) {
        //////////// Only for your domain
        if (settings.url.indexOf(document.domain) >= 0) {
            xhr.setRequestHeader("X-CSRF-Token", "{{csrf_token()}}");
        }
    }
});
Run Code Online (Sandbox Code Playgroud)