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 在存放一些敏感数据,但是一些敏感数据,create 会自动过滤掉怎么办?难道要存入数据库之后再......
$article->user_id = Auth::id();
$article->save();
这样要写入两次数据库。我们可以这么来:
$article= new Article($data);
$article->user_id = Auth::id

这篇博客讨论了Laravel批量赋值带来的安全问题,即批量注入。通过示例展示了用户如何利用此特性冒充他人发布。Laravel提供了fillable(白名单)和guarded(黑名单)属性来解决这个问题,用于控制模型允许自动填充的字段。文章建议使用这两个属性确保数据安全性,并提供了解决创建模型时敏感数据被过滤的处理方法。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



