我正在尝试学习如何通过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会处理吗?还是有更好的方法来做这件事。
答案 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>
请记住@AfikDeri解决方案更便携,更清洁