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应用程序注册了所有的令牌,并包括meta标签,该标签使用Axios HTTP库保存csrf-token。
没有 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 应用程序容易受到各种攻击。
Submit按钮包括控制器部分的功能,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": "NewbieGo", "email": "contact@newbiego.com" }
这是单击Submit按钮时创建的 CSRF 令牌。