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>

上面代码的结果是如下图所示的形式,最终用户可以查看:

Contact 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 令牌。