Php 雄辩-$fillable的真正用途是什么?

Php 雄辩-$fillable的真正用途是什么?,php,laravel,Php,Laravel,这是Laravel文件所说的: 要开始,您应该定义要创建的模型属性 使质量可分配。可以使用上的$fillable属性执行此操作 模型 那么为什么不让->fill()/::create()方法分配所有属性呢?好问题!这可能会有一些启示: 为了便于从表单存储/更新数据,Laravel允许您执行User::update($request->all()) 现在把我想象成一个邪恶的用户:我篡改了表单并添加了以下字段:['role'=>'supermegaadmin']你将它存储在数据库中,我将得到一个我不

这是Laravel文件所说的:

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


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

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

为了便于从表单存储/更新数据,Laravel允许您执行
User::update($request->all())

现在把我想象成一个邪恶的用户:我篡改了表单并添加了以下字段:
['role'=>'supermegaadmin']
你将它存储在数据库中,我将得到一个我不应该得到的角色(这是一个过于简单的场景,但应该可以帮助你抓住重点)


然后,您可以使用
$filleble
$guarded
对可以批量分配的字段进行更好的控制。

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

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

这称为大规模分配漏洞

和laravel provider,它是字段的白名单

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


务必始终将要编辑的属性添加到$filleble数组中。您需要在模型上指定一个可填充的受保护的属性,因为默认情况下,所有有说服力的模型都可以防止质量分配。 那么,什么是质量分配?根据Laravel文件:

当用户通过时,会出现批量分配漏洞 通过请求的意外HTTP参数,以及该参数 在数据库中更改一列,这是您没有预料到的。例如,一个 恶意用户可能通过HTTP发送is_admin参数 请求,然后将其传递到模型的create方法中, 允许用户将自己升级到管理员


非常感谢。一票赞成你的帮助。但没有美元受到保护。有$guardedOoh my bad fixed您可能会争辩说您甚至不需要设置
$filleble
,如果要使用表单请求验证,
$request->validated()
数据将只返回您专门验证的数据。这意味着它将丢弃并忽略用户做出的任何潜在恶意输入。添加到
$filleble
$guarded
会限制您的数据库层,如果您以后想以管理员身份修改
$guarded
字段,则可能会导致额外的复杂性。