- Laravel 教程
- Laravel - 首页
- Laravel - 概述
- Laravel - 安装
- Laravel - 应用结构
- Laravel - 配置
- Laravel - 路由
- Laravel - 中间件
- Laravel - 命名空间
- Laravel - 控制器
- Laravel - 请求
- Laravel - Cookie
- Laravel - 响应
- Laravel - 视图
- Laravel - Blade 模板
- Laravel - 重定向
- Laravel - 数据库操作
- Laravel - 错误与日志
- Laravel - 表单
- Laravel - 本地化
- Laravel - Session
- Laravel - 验证
- Laravel - 文件上传
- Laravel - 发送邮件
- Laravel - Ajax
- Laravel - 错误处理
- Laravel - 事件处理
- Laravel - Facades
- Laravel - Contracts
- Laravel - CSRF 保护
- Laravel - 身份验证
- Laravel - 授权
- Laravel - Artisan 命令行
- Laravel - 加密
- Laravel - 散列
- 理解发布流程
- Laravel - 游客用户权限
- Laravel - Artisan 命令
- Laravel - 分页自定义
- Laravel - Dump Server
- Laravel - Action URL
- Laravel 有用资源
- Laravel - 快速指南
- Laravel - 有用资源
- Laravel - 讨论
Laravel - CSRF 保护
CSRF 指的是针对 Web 应用的跨站请求伪造攻击。CSRF 攻击是系统已认证用户执行的未授权活动。因此,许多 Web 应用容易受到此类攻击。
Laravel 提供以下方式的 CSRF 保护:
Laravel 内置了一个 CSRF 插件,它为每个活跃用户会话生成令牌。这些令牌验证操作或请求是由相关的已认证用户发送的。
实现
本节详细介绍了在 Laravel 中实现 CSRF 保护的方法。在继续进行 CSRF 保护之前,需要注意以下几点:
CSRF 是在 Web 应用中声明的 HTML 表单内实现的。您必须在表单中包含一个隐藏的已验证 CSRF 令牌,以便 Laravel 的 CSRF 保护中间件可以验证请求。语法如下:
<form method = "POST" action="/profile"> {{ csrf_field() }} ... </form>
您可以方便地使用 JavaScript HTTP 库构建基于 JavaScript 的应用程序,因为它将 CSRF 令牌包含到每个传出的请求中。
名为 **resources/assets/js/bootstrap.js** 的文件注册所有 Laravel 应用程序的令牌,并包含一个存储带有 **Axios HTTP 库** 的 **csrf-token** 的 **meta** 标签。
没有 CSRF 令牌的表单
考虑以下代码行。它们显示一个表单,该表单接收两个参数作为输入:**email** 和 **message**。
<form> <label> Email </label> <input type = "text" name = "email"/> <br/> <label> Message </label> <input type="text" name = "message"/> <input type = ”submit” name = ”submitButton” value = ”submit”> </form>
上述代码的结果是最终用户可以查看的以下表单:
上述表单将接受来自授权用户的任何输入信息。这可能会使 Web 应用容易受到各种攻击。
请注意,提交按钮包含控制器部分的功能。**postContact** 函数用于关联视图的控制器中。如下所示:
public function postContact(Request $request) { return $request-> all(); }
请注意,该表单不包含任何 CSRF 令牌,因此作为输入参数共享的敏感信息容易受到各种攻击。
带有 CSRF 令牌的表单
以下代码行显示了使用 CSRF 令牌重新设计的表单:
<form method = ”post” > {{ csrf_field() }} <label> Email </label> <input type = "text" name = "email"/> <br/> <label> Message </label> <input type = "text" name = "message"/> <input type = ”submit” name = ”submitButton” value = ”submit”> </form>
获得的结果将返回包含以下令牌的 JSON:
{ "token": "ghfleifxDSUYEW9WE67877CXNVFJKL", "name": "TutorialsPoint", "email": "[email protected]" }
这是单击提交按钮时创建的 CSRF 令牌。