【问题标题】:Eloquent - What is $fillable really for?Eloquent - $fillable 的真正用途是什么?
【发布时间】:2020-08-07 15:19:53
【问题描述】:

这就是 Laravel 文档所说的:

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

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

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    好问题!这可能会有所启发:

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

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

    然后您可以使用$fillable$guarded 对可以批量分配的字段进行更精细的控制。

    【讨论】:

    • 谢谢。一票赞成您的帮助。但是没有 $protected。有$guarded
    • 哦,我的坏修复
    【解决方案2】:

    务必将您希望能够编辑的属性添加到 $fillable 数组中。您需要在模型上指定 fillableguarded 属性,因为所有 Eloquent 模型都默认防止批量赋值。 那么,什么是批量赋值?根据 Laravel 文档:

    当用户通过 通过请求的意外 HTTP 参数,以及该参数 更改了您没想到的数据库中的列。例如,一个 恶意用户可能通过 HTTP 发送 is_admin 参数 请求,然后将其传递到模型的 create 方法中, 允许用户将自己升级为管理员。

    【讨论】:

    • merC dooste aziz.
    【解决方案3】:

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

    攻击者有时可以使用这种方法来创建开发人员从未想过的新参数,这反过来又会在程序代码中创建或覆盖不希望出现的新变量或对象。

    这称为批量分配漏洞

    还有 laravel 提供者fillable for mass-assignment vulnerability,是字段的白名单。

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

    【讨论】:

    • 你可以争辩说你甚至不需要设置$fillable,如果你要使用表单请求验证,$request->validated()数据只会返回你具体 验证。这意味着它将丢弃并忽略用户所做的任何潜在恶意输入。添加到$fillable$guarded 会限制您的数据库层,如果您以后想以管理员身份修改$guarded 字段,可能会导致额外的复杂性。
    猜你喜欢
    • 2010-10-30
    • 2020-02-02
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多