laravel中模型中$fillable的用法

简介: 通过正确使用 `$fillable`属性,开发者可以有效地保护应用免受批量赋值漏洞的影响。它使得只有指定的字段可以被外部用户输入影响,为应用数据的安全性提供了一道防线。在开发使用Laravel框架的应用时,恰当地设置 `$fillable`或 `$guarded`属性是一项最佳实践。

在Laravel框架中,$fillable 属性在模型(Model)中扮演着至关重要的角色。它是Laravel Eloquent ORM系统提供的一个安全特性,用于防止所谓的“批量赋值漏洞”(Mass Assignment Vulnerability)。本文将深入探讨 $fillable的用途、如何使用它以及为何它如此重要。

$fillable属性的用途

在日常开发过程中,我们经常需要从用户那里接收数据,并将这些数据保存到数据库中。Laravel提供了方便的批量赋值(Mass Assignment)功能,使得开发者可以一次性赋值多个属性。然而,这项功能如果没有适当的限制,也可能带来安全风险。攻击者可能会通过批量赋值漏洞,向数据库写入不应被修改的字段。为了解决这个问题,Laravel引入了 $fillable属性,让我们定义哪些字段可以被批量赋值。

使用 $fillable

在Laravel的Eloquent模型中,$fillable是一个数组,包含了可以被批量赋值的字段名。通过设置这个属性,任何不在该数组中的字段都不会被批量赋值,从而提高了应用程序的安全性。

举个例子,假设我们有一个 User模型,包含 name, email, 和 password字段。如果希望这三个字段都可以通过批量赋值来更新,则可以在 User模型中设置如下:

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

现在,如果我们使用Eloquent的 create方法或是在实例化模型后调用 fill方法,只有在 $fillable数组中列出的字段会被赋值。

$user = User::create([
    'name' => 'John Doe',
    'email' => 'john@example.com',
    'password' => 'secret',
    'is_admin' => 1 // 假设这是不希望通过用户输入直接赋值的字段
]);

由于 is_admin字段没有在 $fillable数组中指定,它不会被批量赋值,从而保证了数据的安全性。

$fillable$guarded

Laravel提供了另外一个与 $fillable对立的属性 $guarded。与 $fillable指定"哪些字段可以被批量赋值"不同,$guarded指定的是"哪些字段不可以被批量赋值"。

一般情况下,应该只使用其中一种方法来保护你的模型,要么是 $fillable,要么是 $guarded。使用两者中的一种,根据具体场景和个人偏好选择最适合你的项目的那个。

结论

通过正确使用 $fillable属性,开发者可以有效地保护应用免受批量赋值漏洞的影响。它使得只有指定的字段可以被外部用户输入影响,为应用数据的安全性提供了一道防线。在开发使用Laravel框架的应用时,恰当地设置 $fillable$guarded属性是一项最佳实践。

目录
相关文章
|
6月前
|
存储 JSON 数据库
Laravel-EloquentORM高级部分解析
Laravel-EloquentORM高级部分解析
53 0
|
XML 前端开发 安全
构建自己的MVC框架(Ruby语言实现)-- 2. 创建ApplicationController
构建自己的MVC框架(Ruby语言实现)-- 2. 创建ApplicationController
|
2月前
|
数据库
ThinkPHP6模型中的获取器,修改器及搜索器的简单使用
本文介绍了ThinkPHP6模型中的获取器、修改器和搜索器的使用方法。获取器用于对模型数据进行自动处理,修改器用于处理模型设置的数据,搜索器用于封装字段的查询条件表达式。文章通过示例代码展示了如何在模型中定义和使用这些方法,以及如何通过控制器调用模型方法进行数据操作。
|
3月前
|
前端开发 JavaScript 安全
|
4月前
|
安全 PHP 数据库
laravel中模型中$fillable的用法
通过正确使用 `$fillable`属性,开发者可以有效地保护应用免受批量赋值漏洞的影响。它使得只有指定的字段可以被外部用户输入影响,为应用数据的安全性提供了一道防线。在开发使用Laravel框架的应用时,恰当地设置 `$fillable`或 `$guarded`属性是一项最佳实践。
59 0
2023-4-11-chrono库用法学习
2023-4-11-chrono库用法学习
72 0
|
SQL PHP 数据库
Laravel Eloquent 模型 进阶技巧
Laravel Eloquent 模型使用进阶技巧
146 0
Laravel Eloquent 关联模型 进阶使用技巧
Laravel Eloquent 关联模型 进阶使用技巧
149 0
|
SQL 存储 前端开发
Django入门-5:模型的基本使用1-模型定义
Django入门-5:模型的基本使用1-模型定义
148 0
Django入门-5:模型的基本使用1-模型定义
|
SQL 前端开发 程序员
Laravel和Thinkphp有什么区别,哪个框架好用
Laravel和Thinkphp有什么区别,哪个框架好用
748 0