Laravel 为了方便数据进行批量操作,提供了批量赋值机制。假如要在数据表中插入一条记录,我们可以使用模型做如下操作:
$article = Article:create($request->all());
这样我们直接将表单提交过来的数据直接写入了数据库(很方便),但是这样做非常不安全。对于用户输入的数据,我们应该永远谨慎对待。假如我们的 articles 表里有一个字段 user_id,是用来标记发布者的,按照以上的写法,用户可以伪造成任何人发布内部。只需要模拟表单提交并设定 user_id 字段即可。这个问题就是我们所讲的 批量注入 的安全问题。
那么如何解决批量注入的安全问题?
Laravel 中的模型提供了 fillable 和 guarded,是专门用来解决批量注入的问题,二者是互斥关系,存在一个就好,如果同时存在,fillable 的优先级更高。
fillable 变量存储允许自动填充的模型字段,可以理解为字段白名单,比如:
protected $fillable = ['title', 'body', 'category_id'];
guarded 变量存储不允许自动填充的模型字段,可以理解为黑名单,比如:
protected $guarded=['user_id'];
有时,我们希望通过 Article::create($data) 的方式存储表单数据,我们会在 $data 在存放一些敏感数据,但是一些敏感数据,