首页 > PHP > Laravel CSRF 保护教程代码示例 生活中比喻示例

Laravel CSRF 保护教程代码示例 生活中比喻示例

2025-02-08 17:00:34

什么是 CSRF

 

CSRF(Cross-Site Request Forgery),即跨站请求伪造,是一种常见的网络攻击手段。攻击者通过诱导用户在已登录的情况下访问恶意链接或网站,利用用户的身份信息在用户不知情的情况下执行一些非法操作,比如转账、修改密码等。

Laravel CSRF 保护机制

 

Laravel 通过在表单中嵌入一个隐藏的令牌(token)来实现 CSRF 保护。这个令牌是一个随机生成的字符串,在用户访问表单页面时由服务器生成并发送给客户端,当用户提交表单时,客户端会将这个令牌连同其他表单数据一起发送回服务器。服务器接收到表单数据后,会验证这个令牌是否有效。如果令牌有效,说明请求是合法的,服务器会处理表单数据;如果令牌无效,服务器会拒绝处理请求,并返回相应的错误信息。

生活中的比喻

可以把 Laravel 的 CSRF 保护机制想象成一个门锁系统。用户登录网站就像是进入了一个房间,房间的门(网站的各种表单操作)需要特定的钥匙(CSRF 令牌)才能打开并进行操作。服务器生成的 CSRF 令牌就像是一把唯一的钥匙,只有拥有这把钥匙的用户才能合法地打开门进行操作。而攻击者就像是一个试图闯入房间进行破坏的小偷,他没有这把钥匙,所以无法通过正常的方式打开门进行非法操作。

示例

下面是一个简单的 Laravel 示例来展示 CSRF 保护的使用:
步骤一:创建表单
在 Laravel 的视图文件(例如 resources/views/form.blade.php)中创建一个表单:
 
 
 
<form method="POST" action="{{ route('submit.form') }}">
    @csrf
    <label for="name">Name:</label>
    <input type="text" id="name" name="name" required><br><br>

    <label for="email">Email:</label>
    <input type="email" id="email" name="email" required><br><br>

    <input type="submit" value="Submit">
</form>
这里的 @csrf 指令会生成一个隐藏的输入字段,其中包含了 CSRF 令牌。

 

步骤二:定义路由和控制器方法
在 routes/web.php 中定义路由:
 
Route::post('/submit/form', [FormController::class, 'submitForm'])->name('submit.form');
然后创建一个控制器(例如 app/Http/Controllers/FormController.php)并定义 submitForm 方法:
 
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class FormController extends Controller
{
    public function submitForm(Request $request)
    {
        // 验证CSRF令牌,如果令牌无效,Laravel会自动返回419错误
        $this->validate($request, [
            'name' => 'required',
            'email' => 'required|email',
        ]);

        // 如果CSRF令牌有效,并且表单数据验证通过,这里可以处理表单数据,例如保存到数据库等
        $name = $request->input('name');
        $email = $request->input('email');

        // 这里可以添加更多的业务逻辑,比如发送邮件等

        return redirect()->back()->with('success', 'Form submitted successfully!');
    }
}

 

在这个示例中,当用户提交表单时,Laravel 会自动验证 CSRF 令牌的有效性。如果令牌无效,用户会看到一个 419 错误页面,表示请求未被授权。如果令牌有效且表单数据验证通过,就会处理表单数据并返回成功消息。
使用 Ctrl+D 可将网站添加到书签
收藏网站
扫描二维码
关注早实习微信公众号
官方公众号
Top