使用Laravel

时间:2017-01-29 15:24:04

标签: javascript php jquery ajax laravel

我正在尝试学习如何通过ajax请求传递csrf令牌(我正在使用Laravel),因为我的ajax url返回500,因为它没有被赋予csrf令牌。

使用get请求不太安全吗?人们可以欺骗来自外部网站的请求吗?我只是在寻找最好的方法,没有任何安全漏洞。

这是我的ajax代码:

saveHousekeepingNotes();

function saveHousekeepingNotes() {
    $.ajax({
        url: "/ajax/save-notes",
        type: "POST",
        data: 'Here we have some data.',
        beforeSend: function(xhr) {
            $('.notes-status-holder').html('Saving...');
        },
        success: function(data) {
            var jqObj = jQuery(data);
            var d = new Date();
            $('.notes-status-holder').html('autosaved ' + d.toLocaleTimeString());

            setInterval(function() {
                saveHousekeepingNotes();
            }, 5 * 1000);
        },
    });
}

在我的刀片文件中:

<script>$.ajaxSetup({ headers: { 'csrftoken' : '{{ csrf_token() }}' } });</script>

在我的路线中:

Route::group(['middleware' => 'ajax', 'prefix' => 'ajax'], function() {
            Route::any('/save-notes', 'AjaxController@saveNotes');
        });

在我的ajax控制器中:

<?php

namespace App\Http\Controllers\Admin\Admin;

use Illuminate\Http\Request;
use Cache;
use Auth;
use App\Database\Website\User\Roleplay;

class AjaxController
{
    public function saveNotes()
    {
        if (!Auth::guest()) {
            $roleplay = Roleplay::where('user_id', Auth::user()->id)->first();
            $roleplay->housekeeping_notes = 'We saved it:) ' . rand(10,40);
            $roleplay->save();
        }
    }
}

我的ajax中间件只检查$ request-&gt; ajax()以验证其ajax调用。所以我基本上要问的是如何安全地传递csrf令牌? Laravel会处理吗?还是有更好的方法来做这件事。

3 个答案:

答案 0 :(得分:2)

好吧,根据Laravel Docs,您最好将csrf令牌存储在元标记中,如下所示:

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

然后在您的主javascript文件中包含每个请求的此标头(请注意您提供的标题名称错误):

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

然后它应该工作:)

答案 1 :(得分:1)

请使用此功能。

_token: '{{ csrf_token() }}'

这是因为ajax请求也在发送字段的名称。
通常,如果您创建csrf_field,则可以使用名称_token找到它,只需在此处使用。

$.ajax({
    url: "/ajax/save-notes",
    type: "POST",
    data: {
        _token: '{{ csrf_token() }}',
        // rest data here
    },
    beforeSend: function(xhr) {
        $('.notes-status-holder').html('Saving...');
    },
    success: function(data) {
        var jqObj = jQuery(data);
        var d = new Date();
        $('.notes-status-holder').html('autosaved ' + d.toLocaleTimeString());

        setInterval(function() {
            saveHousekeepingNotes();
        }, 5 * 1000);
    },
});

答案 2 :(得分:0)

如果你想以你当前的方式传递csrf,你必须告诉htaccess将这个标题传递给你的脚本并修改它的名字

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

RewriteEngine On

# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]


# Handle custom csrf Header
    RewriteCond %{HTTP:csrftoken} .
    RewriteRule .* - [E=X-XSRF-TOKEN:%{HTTP:csrftoken}]
</IfModule>

请记住@Afik​​Deri解决方案更便携,更清洁

相关问题