解决laravel批量插入或者使用firstOrCreate/updateOrCreate出现MassAssignmentException错误

Song3820 次浏览0个评论2018年03月27日

laravel批量插入或者使用firstOrCreate/updateOrCreate出现MassAssignmentException错误,

MassAssignmentException in Model.php line 452

你需要先在你的模型上定义一个fillableguarded属性,因为所有的Eloquent模型都针对批量赋值(Mass-Assignment)做了保护。

当用户通过HTTP请求传入了非预期的参数,并借助这些参数更改了数据库中你并不打算要更改的字段,这时就会出现批量赋值(Mass-Assignment)漏洞。例如,恶意用户可能会通过HTTP请求发送is_admin参数,然后对应到你模型的create方法,此操作能让该用户把自己升级为一个管理者。

一、fillable方法

你应该定义好哪些模型属性是可以被批量赋值的。你可以在模型上使用$fillable属性来实现。

class User extends Model
{
    protected $fillable = ['username', 'email', 'password'];
}

二、guarded方法

$fillable作为一个可以被批量赋值的属性「白名单」。另外你也可以选择使用$guarded$guarded属性应该包含一个你不想要被批量赋值的属性数组。所有不在数组里面的其它属性都可以被批量赋值。因此,$guarded 的功能更类似一个「黑名单」。使用的时候应该只选择$fillable$guarded中的其中一个。 下面这个例子中,除了price所有的属性都可以被批量赋值:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * 不可被批量赋值的属性。
     *
     * @var array
     */
    protected $guarded = ['price'];
}

如果你想让所有的属性都可以被批量赋值,你应该定义 $guarded为空数组。

/**
 * 不可被批量赋值的属性。
 *
 * @var array
 */
protected $guarded = [];

提交评论

请登录后评论

用户评论

    当前暂无评价,快来发表您的观点吧...

更多相关好文

    当前暂无更多相关好文推荐...