Laravel 的模型中 fillable 与 guarded 用法

14

Laravel 的模型中有两个 protected字段fillableguarded,注意:必须是protected以上开放程度。 我们经常通过提交表单进行数据的增删改,为了方便的进行数据批量修改操作 Laravel 提供了批量赋值机制:

假如我们想要在数据库表中添加一行,我们可以使用模型这么操作:

$post = Post::create($request->all());

这样我们就直接将表单中提交过来的所有信息直接录入进了数据库,是不是很方便,但是 这样是非常不安全的,对于用户输入的数据,我们应该永远的谨慎对待。 假如我们的 posts 表里有一个字段 user_id,是用来标记发布者的,按照以上的写法,用户可以伪造成任何人发布内容,只需要模拟表单提交并设定 user_id 字段即可。 此问题是被我们也称为批量注入 的安全问题。

Laravel 中的模型就提供了fillableguarded,是专门用来解决批量注入问题的。使用也是非常简单,两者是 互斥关系,存在一个就好,如果同时存在,fillable 优先级较高

fillable 变量存储允许自动填充模型字段的数组,可以理解为字段修改 白名单,比如:

protected  $fillable = ['title', 'body', 'category_id'];

guarded 变量存储 不允许 自动填充的模型字段,是修改字段的黑名单,比如:

protected  $guarded=['user_id'];

有时候我们希望通过 Post::create($data) 的方式存储表单数据,我们会在 $data 中存放一些敏感信息,但是一些敏感信息,create 方法会直接过滤掉怎么办? 难道要存入数据库之后再....

$post->user_id = Auth::id();
$post->save();

这不是要写入两次数据库!我们可以这么来:

$post = new Post($data);
$post->user_id = Auth::id();
$post->save();

我们先使用 Laravel 自带的批量赋值机制过滤一遍敏感信息,然后我们自己来过滤敏感信息的输入。

注意:当模型中未指定fillableguarded时,即$fillable=[] and $guarded==[*] 时,传入模型实例化参数时会报MassAssignmentException错误。每一次当你看到此提示,应该很欣慰,因为这是 Laravel 为你避免批量注入的安全问题。

讨论数量: 3

$post = Post::creat($request->all()); 这里面的creat应该是create

4周前

$post = Post::creat($request->all());
这个是create

4周前

  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,使用方法请见 Emoji 自动补全来咯,可用的 Emoji 请见 :metal: :point_right: Emoji 列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
  请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!