是否可以仅使用 csrf 字段而不是令牌来使用 ajax 请求插入数据?

Posted

技术标签:

【中文标题】是否可以仅使用 csrf 字段而不是令牌来使用 ajax 请求插入数据?【英文标题】:Is it possible to insert data with ajax request by only using the csrf field instead of token? 【发布时间】:2018-09-13 01:32:57 【问题描述】:

我正在尝试使用 CSRF 字段插入数据。我真的没有 CSRF 令牌的想法。 (新的 laravel)。我在 /classwork/insert 中遇到未知状态错误。

//This is my ajax function: I really can't understand what is wrong with the code.

是否可以仅使用 csrf-field 进行 ajax 调用

function insertData(e)

    e.preventDefault();
    var data = $(this).serialize();
    $.ajax(

        url: '/classwork/insert',
        method: 'post',
        data : 'data',
        success:function(data)
            console.log(data);          
        

    );


//This is my controller and Route:

public function insertTask(Request $request)
  $task = new Task;
  $task->task = $request->task;
  $task->save();


//this is my route
Route::post('/classwork/insert', 'TaskController@insertTask');

【问题讨论】:

嗨@rakesh shrestha,当您通过 POST 方法强制通过 CSRF 令牌时,像这样的标头:'X-CSRF-TOKEN': $('meta[name="csrf-token"]')。 attr('内容') 谢谢!但我还有其他问题..你能帮忙吗?消息:“SQLSTATE [23000]:完整性约束违规:1048 列'任务'不能为空(SQL:插入taskstaskupdated_atcreated_at)值(,2018-04-03 16 :49:42, 2018-04-03 16:49:42))" 【参考方案1】:

试试这个方法

在ajax调用之前添加这个

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

【讨论】:

现在我得到一个类似这样的错误:消息:“SQLSTATE [23000]:完整性约束违规:1048列'任务'不能为空(SQL:插入taskstaskupdated_at, created_at) 值 (, 2018-04-03 16:49:42, 2018-04-03 16:49:42))" 在您的代码中,您没有发送任何数据,这就是将空值插入数据库表的原因。所以错误显示。尝试在ajax函数的data属性中发送数据 我已经序列化了数据.. 它不作为 json 传递? ..我现在如何传递数据.. afsal 尝试在 ajax 函数 dataType: 'json' 中使用这个【参考方案2】:

请始终在主刀片页面中添加此元标记

<meta name="csrf-token" content=" csrf_token() ">

而不是旧的 scholl jquery ajax.. 只需使用 Axios。简单而且很容易。它已经检测到 csrd-token 元标记。所以不需要在表单或标题中做

改变这个

$.ajax(

    url: '/classwork/insert',
    method: 'post',
    data : 'data',
    success:function(data)
        console.log(data);          
    

);

到这里

axios.post('/classwork/insert', data)
.then(function(response)  
    console.log(response);
);

【讨论】:

感谢您的帮助!! ..但现在我遇到另一个错误..你能再次帮忙@zeroOne ..消息:“SQLSTATE [23000]:完整性约束违规:1048列'任务'不能为空(SQL:插入@ 987654324@( task, updated_at, created_at) 值 (, 2018-04-03 17:00:48, 2018-04-03 17:00:48))" 表示'task'值不能为空。请检查'task'变量是否有值 以及为什么axios没有定义先生【参考方案3】:

创建一个通用的 ajaxRequest 函数。将此添加到元

<meta name="csrf-token" content=" csrf_token() ">

然后在你的全局 ajax 函数中执行此操作;

public function ajaxRequest(options)
$.ajaxSetup(
 headers: 
    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
 
);
$.ajax(

    url: option.url,
    method: option.method,
    data : option.data,
    success:function(data)
        console.log(data);          
    

);

【讨论】:

以上是关于是否可以仅使用 csrf 字段而不是令牌来使用 ajax 请求插入数据?的主要内容,如果未能解决你的问题,请参考以下文章

使用 AJAX GET 方法的 CSRF 令牌保护

何时需要使用令牌保护表单(CSRF 攻击)?

关于 CSRF 的问题

在隐藏字段中添加反 CSRF 令牌真的可以防止 CSRF 攻击吗? [复制]

公开会话的 CSRF 保护令牌是不是安全?

使用会话令牌实现 CSRF 保护