📅  最后修改于: 2023-12-03 15:00:04.293000             🧑  作者: Mango
CSRF(Cross-Site Request Forgery)又称跨站请求伪造或者“One Click Attack”。攻击者利用用户已经登录了一个网站的登录状态,诱导用户点击一个链接或者打开一个特殊的网页,来使用户在未知情况下对该网站进行某些操作,比如发帖、评论等。
CSRF 令牌是一种防范 CSRF 攻击的方法。它通过在表单中添加一个随机的 token 值来防止 CSRF 攻击。表单生成后,服务器会将 token 值存储在 session 中。当表单提交后,服务器会比对表单中的 token 值和存储在 session 中的 token 值是否相同,如果不相同,则认为是 CSRF 攻击,并返回错误信息。
在 Laravel 中,生成 CSRF 令牌非常简单。在所有的 POST、PUT 和 DELETE 表单中,可以添加 CSRF 令牌的隐藏字段。
<form method="POST" action="/example">
@csrf
<!-- 其他表单元素 -->
</form>
上面的例子中,表单中添加了 @csrf 标记,这将会被编译成一个隐藏的 _token 表单元素。
Laravel 会自动验证请求中的 _token 值是否与存储在 session 中的值匹配。如果匹配失败,Laravel 会抛出 TokenMismatchException 异常。此异常将会被 Exception Handler 捕获,重定向到 /home 界面并显示错误消息。
另外,Laravel 还提供了一个 CSRF 中间件。中间件会验证每一个 POST、PUT 和 DELETE 请求中的 CSRF 令牌,如果令牌不匹配,则会返回一个 HTTP 400 错误响应。
CSRF 是一种非常危险的攻击。Laravel 通过提供 CSRF 令牌来解决这个问题。使用 Laravel 提供的 @csrf 标记非常简单,在表单中添加一个隐藏的值即可。此外,Laravel 还提供了一个 CSRF 中间件来帮助开发者验证请求中的 CSRF 令牌。