Laravel 逐字段设置时是否需要担心批量赋值

Laravel do I have to worry about mass assignment when setting field by field

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

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

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

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

如果没有批量分配保护,了解底层应用程序架构的用户可以将值注入到他们不希望访问的字段中,例如,如果您的用户字段具有 is_admin 值,他们可以更改他们的is_admin1 而不是 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]);
    

您不需要在您的示例中禁用批量分配保护,因为您不是批量分配值,而是为每个 属性 单独分配一个值。您可以通过问自己 "Am I passing in an array of properties and their values?".

来确定您是否正在使用批量分配

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