Laravel在逐个字段设置时是不是必须担心质量分配

Posted

技术标签:

【中文标题】Laravel在逐个字段设置时是不是必须担心质量分配【英文标题】:Laravel do I have to worry about mass assignment when setting field by fieldLaravel在逐个字段设置时是否必须担心质量分配 【发布时间】:2018-09-23 04:12:06 【问题描述】:

当谈到 laravel 批量分配时,我有点困惑。

我知道我可以使用以下方法保护字段:

protected $fillable = [
        'username', 'email', 'password'
    ];

在这里受到保护:

$flight = App\Flight::create(Input:all);

or

$flight->fill(['name' => 'Flight 22']);

但我像这样创建或更新模型:

public function createUser(NewUserRequest $request, User $newUser)
    

$newUser->insertUser($request);


insertUser 如下所示:

public function insertUser($request)
    
        $newUser = $this;
        $newUser->user_type = (int) $request->input('user_type');
        $newUser->username = $request->input('username');
        $newUser->email = $request->input('email');
        if ($request->filled('password')) 
            $newUser->password = bcrypt($request->input('password'));
        
        if ($request->filled('facebook_id')) 
            $newUser->facebook_id = $request->input('facebook_id');
        
        $newUser->save();

        return $newUser;
    

如您所见,我总是选择要插入的字段和应插入的数据。那么当我不使用create()fill() 方法时,我真的需要设置我的$fillable 吗?

【问题讨论】:

不,您可以按照自己的方式进行操作而无需设置。 @Jeff 只是为了仔细检查。当我使用create()fill() 这两个功能中的一些时,我是否只需要担心$fillable 或者Laravel 中是否有更多“自动填充”功能? 每当您使用数组设置属性时,它都会根据$guarded$fillable 对其进行检查。所以updateOrCreatefirstOrNew等也 【参考方案1】:

批量分配保护的目的是保护直接从用户输入获取模型属性的开发人员,例如:

Example::create($request->input());

如果没有批量分配保护,了解底层应用程序架构的用户可以将值注入到他们不希望访问的字段中,例如,如果您的用户字段具有 is_admin 值,他们可以将其 is_admin 更改为1 而不是 0

在使用未经处理的用户输入时需要批量分配保护,并且批量分配保护仅在批量分配时默认启用。安全应用程序有 3 个选项:

    利用批量分配并将$fillable中的每个属性列入白名单 单独分配值,因此没有批量分配保护,例如:$user->name = 'John Doe'

    禁用批量分配保护,不要从用户输入批量分配,例如:

    protected $guarded = [];
    
    Example::create($request->only('name', 'age'));
    
    Example::create(['name' => $request->name, 'age' => $request->age]);
    

您不需要在示例中禁用批量分配保护,因为您不是批量分配值,而是单独为每个属性分配值。您可以通过问自己“我是否传入了一组属性及其值?”来确定您是否使用批量赋值。

您可以在Eloquent documentation 中了解有关批量分配的更多信息。

【讨论】:

以上是关于Laravel在逐个字段设置时是不是必须担心质量分配的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 验证仅在字段不为空时验证正则表达式

一次显示验证消息(验证摘要)而不是逐个jqgrid?

求指点:VARCHAR的长度设置对读取效率影响大吗?

Laravel 5 |设置 ID 字段的分页问题

使用 laravel 迁移将默认设置为 NULL

Laravel 5.1通过急切加载返回连接字段