Eloquent - $fillable 的真正用途是什么?

Vah*_*015 4 php laravel

这是 Laravel 文档所说的:

首先,您应该定义要使质量可分配的模型属性。您可以使用模型上的 $fillable 属性执行此操作

那么为什么不让 ->fill()/::create() 方法分配所有属性呢?

Chr*_*ert 5

好问题!这可能会带来一些启示:

为了轻松存储/更新表单中的数据,Laravel 允许您执行User::update($request->all());

现在将我想象为一个邪恶的用户:我篡改表单并添加以下字段:['role' => 'supermegaadmin']您将其存储在数据库中,我将获得一个我不应该获得的角色(这是一个过于简单的场景,但应该帮助你明白要点)

然后,您可以使用$fillable$guarded来更好地控制可批量分配的字段。


Tsa*_*oga 5

软件框架有时允许开发人员自动将 HTTP 请求参数绑定到程序代码变量或对象中,以便开发人员更轻松地使用该框架。这有时会造成伤害。

攻击者有时可以使用这种方法来创建开发人员从未打算过的新参数,从而在程序代码中创建或覆盖非预期的新变量或对象。

这称为批量分配漏洞

并且 laravel provider可填充批量分配漏洞,它是字段的白名单。

当用户通过请求传递意外的 HTTP 参数,并且该参数更改了数据库中您意想不到的列时,就会出现批量分配漏洞。例如,恶意用户可能会通过 HTTP 请求发送 is_admin 参数,然后将其传递到模型的 create 方法中,从而允许用户将自己升级为管理员。

  • 您可能会说,您甚至不需要设置“$fillable”,如果您要使用表单请求验证,“$request->validated()”数据将仅返回您*专门*验证的数据。这意味着它将丢弃并忽略用户所做的任何潜在的恶意输入。添加到“$fillable”和“$guarded”会限制您的数据库层,如果您稍后想以管理员身份修改“$guarded”字段,可能会导致额外的复杂性。 (2认同)