Laravel 4 CSRF 表单通过 Ajax 调用提交

Posted

技术标签:

【中文标题】Laravel 4 CSRF 表单通过 Ajax 调用提交【英文标题】:Laravel 4 CSRF form submit through Ajax call 【发布时间】:2013-12-25 00:06:51 【问题描述】:

我是 *** 和 Laravel 4 的新手, 我正在尝试通过 jquery ajax 提交表单。我 serializeArray() 表单并使用 json 提交它。 在 laravel 中,在我检查提交的 csrf 令牌的路由中,转到我的控制器以获取流程输入。 当 _token 输入与 serializeArray() 一样位于数组中时,csrf 检查不起作用。 我必须获取 _token 值并提交作为单独的 ajax 数据。我想知道是否有办法告诉 csrf 过滤器在哪里运行以检查输入数组中的 hte 字段 _token 并使用它? 这是我的代码:

routes.php

Route::post('searchAjax', array('before' => 'csrf', 
                                'uses' => 'SearchController@searchAjax'));

这是我不希望它读取数组 form[0]['_token] 但我不知道如何告诉它这样做的地方。

index.js
    var form = $('#search').serializeArray();
var token = $('#search > input[name="_token"]').val();
$.ajax(
    type: 'post',
    url: 'searchAjax',
    dataType: 'json',
    data:  _token: token, form: form ,
    success: function(data) 
        for(var key in data)
        
            //alert(key)
        
        //alert(data.message);
    
);

我想摆脱 ajax 调用中的 _token: token, form: form 并且只拥有一个包含 _token 的数组的“form”。 这是html

<form id="search" class="form-horizontal" accept-charset="UTF-8" action="http://testing:998/search" method="POST">
  <input type="hidden" value="6GBbv9LmnOdL8UcOsm8DDJ4Bfi6eGcQRlC9SPdL4" name="_token">
<div class="control-group">
  <label class="control-label" for="title">Book Titles</label>
  <div class="controls">
    <input id="title" class="input" type="text" value="click to search book titles" name="title">
  </div>
</div>
<div class="control-group">
<div class="control-group">
<div class="control-group">
</form>

提前谢谢你。 :)

【问题讨论】:

data: _token: token, form: form 有什么问题,你想要什么? 没有问题,但是表单已经包含_token。我只是想让我的代码更简单,看看是否有办法访问 Route:: 以在之前执行一个函数,然后链接到一个控制器。 你的问题很混乱,能改一下吗? 我也有同样的问题 【参考方案1】:

另一种选择是使用 Kelt Docins 概述的方法,即使用 jquery 在标头中发送令牌,例如。在您的 jquery/javascript 引导添加的某处:

$.ajaxSetup(
    headers: 
        'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
    
);

这将从标头元数据标记中获取 CSRF 令牌,并将其包含在每个 ajax 请求的标头中。然后你需要将元数据和令牌添加到你的 Laravel 模板中,例如。

<head>
    <title>My Page</title>
    <meta name="csrf-token" content="<?= csrf_token() ?>">

您还需要修改 CSRF 过滤器以检查 ajax 请求标头以及默认 Input::get('_token')

Route::filter('csrf', function()


   $token = Request::ajax() ? Request::header('X-CSRF-Token') : Input::get('_token');
   if (Session::token() != $token) 
      throw new Illuminate\Session\TokenMismatchException;
   
);

【讨论】:

@Wistar 链接再次生效,这是后续帖子的链接(您也应该阅读此链接,因为它提高了安全性)keltdockins.com/2013/12/12/csrf-token-protection-in-laravel @Danny 我注意到了。忘记删除我的评论了。 还要注意在 Laravel 4 中使用 CSRF 过滤器发现的漏洞:blog.laravel.com/csrf-vulnerability-in-laravel-4 请注意,所有建议的链接都已损坏。

以上是关于Laravel 4 CSRF 表单通过 Ajax 调用提交的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ajax 在 LARAVEL 中获取新的 CSRF 令牌

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

带有 axios 和 vue 的 laravel 5.8 中的 CSRF

Codeigniter 4 在 AJAX 模式中重用 CSRF 令牌

当通过Ajax进行POST时,Laravel 5.6 CSRF令牌失败

表单数据为空 - laravel 5.4