当逐场设置时,Laravel我不得不担心质量分配

时间:2018-04-12 21:30:17

标签: laravel mass-assignment

当涉及到laravels大规模任务时,我有点困惑。

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

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;
    }

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

  1. 使用质量分配并将$fillable
  2. 中的每个属性列入白名单
  3. 单独分配值,因此没有质量分配保护,例如:$user->name = 'John Doe'
  4. 禁用质量分配保护,不要从用户输入中进行质量分配,例如:

    protected $guarded = [];
    
    Example::create($request->only('name', 'age'));
    
    Example::create(['name' => $request->name, 'age' => $request->age]);
    
  5. 您不需要在示例中禁用质量分配保护,因为您没有批量分配值,而是分别为每个属性分配值。您可以通过问自己“我是否传递了一系列属性及其值?”来确定您是否正在使用批量分配。

    您可以在Eloquent documentation中了解有关群发作业的详情。