【发布时间】:2020-08-07 15:19:53
【问题描述】:
这就是 Laravel 文档所说的:
首先,您应该定义您想要的模型属性 使质量可分配。您可以使用 $fillable 属性来执行此操作 型号
那么为什么不让所有属性都由 ->fill()/::create() 方法分配呢?
【问题讨论】:
这就是 Laravel 文档所说的:
首先,您应该定义您想要的模型属性 使质量可分配。您可以使用 $fillable 属性来执行此操作 型号
那么为什么不让所有属性都由 ->fill()/::create() 方法分配呢?
【问题讨论】:
好问题!这可能会有所启发:
为了方便存储/更新表单中的数据,Laravel 允许您执行 User::update($request->all());
现在把我想象成一个邪恶的用户:我篡改了表单并添加了以下字段:['role' => 'supermegaadmin'] 你将它存储在数据库中,我将获得一个我不应该获得的角色(这是一个结束- 简单的场景,但应该可以帮助您理解重点)
然后您可以使用$fillable 和$guarded 对可以批量分配的字段进行更精细的控制。
【讨论】:
务必将您希望能够编辑的属性添加到 $fillable 数组中。您需要在模型上指定 fillable 或 guarded 属性,因为所有 Eloquent 模型都默认防止批量赋值。 那么,什么是批量赋值?根据 Laravel 文档:
当用户通过 通过请求的意外 HTTP 参数,以及该参数 更改了您没想到的数据库中的列。例如,一个 恶意用户可能通过 HTTP 发送 is_admin 参数 请求,然后将其传递到模型的 create 方法中, 允许用户将自己升级为管理员。
【讨论】:
软件框架有时允许开发人员将 HTTP 请求参数自动绑定到程序代码变量或对象中,以使开发人员更容易使用该框架。这有时会造成伤害。
攻击者有时可以使用这种方法来创建开发人员从未想过的新参数,这反过来又会在程序代码中创建或覆盖不希望出现的新变量或对象。
这称为批量分配漏洞。
还有 laravel 提供者fillable for mass-assignment vulnerability,是字段的白名单。
当用户通过请求传递意外的 HTTP 参数并且该参数更改了您未预料到的数据库中的列时,就会发生批量分配漏洞。例如,恶意用户可能会通过 HTTP 请求发送 is_admin 参数,然后将其传递到模型的 create 方法中,从而允许用户将自己升级为管理员。
【讨论】:
$fillable,如果你要使用表单请求验证,$request->validated()数据只会返回你具体 验证。这意味着它将丢弃并忽略用户所做的任何潜在恶意输入。添加到$fillable 和$guarded 会限制您的数据库层,如果您以后想以管理员身份修改$guarded 字段,可能会导致额外的复杂性。