在Laravel中如何通过Ajax请求传递CSRF令牌?

WBOY
发布: 2023-09-10 15:12:01
转载
1754 人浏览过

CSRF 代表跨站请求伪造。 CSRF 是未经授权的用户冒充授权执行的恶意活动。

Laravel 通过为每个活动用户会话生成 csrf 令牌来保护此类恶意活动。令牌存储在用户的会话中。如果会话发生变化,它总是会重新生成,因此每个会话都会验证令牌,以确保授权用户正在执行任何任务。以下是访问 csrf_token 的示例。

生成csrf令牌

您可以通过两种方式获取令牌。

  • 通过使用 $requestsession()token()

  • 直接使用csrf_token()方法

示例

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Student;

class StudentController extends Controller {
   public function index(Request $request) {
      echo $token = $request->session()->token();
      echo "<br/>";
      echo $token = csrf_token();
   }
}
登录后复制

输出

上面的输出是 -

13K625e8mnDna1oxm9rqjfAPfugtTlYdndBoNR4d
13K625e8mnDna1oxm9rqjfAPfugtTlYdndBoNR4d
登录后复制

刀片模板中的 CSRF 令牌

每当您必须在 html 表单中使用 POST、PUT、PATCH、DELETE 时,请确保将 csrf 令牌作为 html 表单中的隐藏字段。这将确保所发出的请求受到 CSRF 中间件保护的保护。

在刀片模板中,您可以使用 @csrf 指令来帮助您生成 csrf 令牌,该令牌稍后可以存储为隐藏字段,如下所示 -

示例

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Student;

class StudentController extends Controller {
   public function index(Request $request) {
      return view('hello');
   }
}
登录后复制

hello.blade.php

<form method="POST" action="/student">
   @csrf
   
   <!-- Equivalent to... -->
   <input type="hidden" name="_token" value="{{ csrf_token() }}" />
</form>
登录后复制

在Laravel中如何通过Ajax请求传递CSRF令牌?

在 Ajax 请求中使用 csrf 令牌

这里将使用 Ajax 请求并在其中传递 csrf 令牌。在 Ajax 中使用 csrf 令牌。您需要在 html 的 head 部分添加 csrf 令牌,如下所示 -

<meta name="csrf-token" content="{{ csrf_token() }}">
登录后复制

在 html 中包含 jquery 文件,因为我们将使用 $.ajaxSetup() 和 $.ajax 进行 ajax 调用。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
登录后复制

稍后使用标头调用 ajaxsetup,如下所示 -

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

现在进行 ajax 调用,如下所示 -

$.ajax({
   type:'POST',
   url:'/getdata',
   success:function(data) {
      $("#data").html(data.msg);
   },
   
   error: function (msg) {
      console.log(msg);
   var errors = msg.responseJSON;
   }
});
登录后复制

ajaxtest.blade.php 中的完整代码是 -



   Ajax CSRF TOKEN Example
   <meta name="csrf-token" content="{{ csrf_token() }}">
   
   
   <script>
      function getData() {
         console.log("ABCD");
         $.ajaxSetup({
            headers: {
               'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
         });
         $.ajax({
            type:'POST',
            url:'/getdata',
            success:function(data) {
               $("#data").html(data.msg);
            },
            error: function (msg) {
               console.log(msg);
               var errors = msg.responseJSON;
            }
         });
      }
   </script>


   
'/ajaxtest'));?> 'getData()']);?>
登录后复制

AjaxCSRFController.php

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

class AjaxCSRFController extends Controller {
   public function index() {
      $data = "Hello World";
      return response()->json(array('msg'=> $data), 200);
   }
}
登录后复制

在routes/web.php中创建CSRF测试的路由

Route::get('ajaxtest',function() {
   return view('ajaxtest');
});
Route::post('/getdata',[AjaxCSRFController::class, 'index']);
登录后复制

现在在浏览器中点击网址:http://localhost:8000/ajaxtest,您将得到以下输出 -

在Laravel中如何通过Ajax请求传递CSRF令牌?

以上是在Laravel中如何通过Ajax请求传递CSRF令牌?的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:tutorialspoint.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板