为啥如果我不将 csrf_field() 放在表单的末尾(在 Laravel 5 视图中)我会获得 TokenMismatchException?

Posted

技术标签:

【中文标题】为啥如果我不将 csrf_field() 放在表单的末尾(在 Laravel 5 视图中)我会获得 TokenMismatchException?【英文标题】:Why if I don't put a csrf_field() at the end of a form (in a Laravel 5 view) I obtain a TokenMismatchException?为什么如果我不将 csrf_field() 放在表单的末尾(在 Laravel 5 视图中)我会获得 TokenMismatchException? 【发布时间】:2017-07-10 20:46:09 【问题描述】:

我对@9​​87654321@ 和Laravel 很陌生,我对插入<form>csrf_field() 表示法有以下疑问。

进入一个视图我有以下形式:

<form method="post" action="/registration">

  <div class="form-group">
    <label>Nome</label>
    <div class="input-group">
      <div class="input-group-addon"><i class="fa fa-user"></i></div>
      <input type="text" name="name" class="form-control" placeholder="Inserisci il tuo nome">
    </div>
  </div>

  <div class="form-group">
    <label>Cognome</label>
    <div class="input-group">
      <div class="input-group-addon"><i class="fa fa-user"></i></div>
      <input type="text" name="surname" class="form-control" placeholder="Inserisci il tuo cognome">
    </div>
  </div>

  <!-- Some other fields -->

  csrf_field()

  <button type="submit" class="btn btn-default">Submit</button>

</form>

这是由这种简约的控制器方法处理的:

public function store(Request $request)

    return $request->all();

因此,如果我将 csrf_field() “声明”放在提交按钮之前,它可以正常工作,并且控制器方法可以正确处理请求,但是如果我删除此行,它就无法工作并且我获得了一个TokenMismatchException

为什么会这样,究竟是什么代表了这个csrf_field(),为什么我要在表单中使用它?

【问题讨论】:

对于请求方法,它会搜索 csrf 令牌 【参考方案1】:

Laravel 可以轻松保护您的应用程序免受跨站请求伪造 (CSRF) 攻击。跨站点请求伪造是一种恶意利用,代表经过身份验证的用户执行未经授权的命令。 Laravel 为应用程序管理的每个活动用户会话自动生成一个 CSRF “令牌”。此令牌用于验证经过身份验证的用户是实际向应用程序发出请求的用户。 每当您在应用程序中定义 html 表单时,您都应该在表单中包含一个隐藏的 CSRF 令牌字段,以便 CSRF 保护中间件可以验证请求。

更多信息请参考CSRF Protection documentation。

【讨论】:

好的,我唯一的疑问是我不是经过身份验证的用户。这是一个公共页面。那么具体是如何工作的呢?【参考方案2】:

CSRF 代表 跨站请求伪造

在这种情况下,Laravel 要求该字段与请求一起发送,以便在回发时验证请求不是伪造的。

可以在这里找到一个很好的解释:https://***.com/a/33829607/1068537

【讨论】:

【参考方案3】:

简短的回答是防止跨站请求伪造

跨站请求伪造,又称一键攻击或会话 骑行并缩写为 CSRF 或 XSRF,是一种对未经授权的网站的恶意利用 命令是从网站信任的用户传输的。 [2] 与利用用户信任的跨站点脚本 (XSS) 不同 对于特定站点,CSRF 利用站点在 用户的浏览器。

更多关于https://laravel.com/docs/5.4/csrf

简单来说,它用于确保提交的表单是从服务器生成的,并且是从用户的浏览器应用的,而不是机器人或任何类型的程序代理。

不管你是否使用像 Laravel 这样的框架,处理 CSRF 非常重要。

【讨论】:

以上是关于为啥如果我不将 csrf_field() 放在表单的末尾(在 Laravel 5 视图中)我会获得 TokenMismatchException?的主要内容,如果未能解决你的问题,请参考以下文章

如何在javascript中获取django表单值而不将其保存到模型中

在 UITextView 上调用 setAttributedText 会重置字体大小,我不知道为啥

为啥不将值添加到 NSMutableArray?

如果我不将 8051 中的端口设置为输入或输出会怎样?

为啥不将 Mybatis 集成到 quarkus 系统中呢?

为啥标准不将模板构造函数视为复制构造函数?