CSRF(Cross-Site Request Forgery),即跨站请求伪造,是一种常见的网络攻击手段。攻击者通过诱导用户在已登录的情况下访问恶意链接或网站,利用用户的身份信息在用户不知情的情况下执行一些非法操作,比如转账、修改密码等。
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 错误页面,表示请求未被授权。如果令牌有效且表单数据验证通过,就会处理表单数据并返回成功消息。