拉拉维尔隐藏属性。例如:密码 - 安全性

2022-08-30 20:38:34

根据 http://laravel.com/docs/eloquent,可以通过在模型中使用受保护的$hidden变量来隐藏数组或JSON转换中的属性。

class User extends Eloquent {
    protected $hidden = array('password');
}

很好,但是,在运行时,加密的密码在User对象内从服务器发送到客户端。print_r(User::all())

这不仅限于print_r(),如果查询特定用户,则会在视图中显示加密的密码。$user->password

有没有办法阻止这种情况?每次查询我的用户对象时,密码都会作为数据的一部分随之发送,即使它不需要。

Illuminate\Database\Eloquent\Collection Object
(
[items:protected] => Array
    (
        [0] => User Object
            (
                [hidden:protected] => Array
                    (
                        [0] => password
                    )

                [connection:protected] => 
                [table:protected] => 
                [primaryKey:protected] => id
                [perPage:protected] => 15
                [incrementing] => 1
                [timestamps] => 1
                [attributes:protected] => Array
                    (
                        [id] => 1
                        [email] => admin@admin.com
                        [first_name] => Admin
                        [last_name] => User
                        [password] => $2y$10$7Wg2Wim9zHbtGQRAi0z6XeapJbAIoh4RhEnVXvdMtFnwcOh5g/W2a
                        [permissions] => 
                        [activated] => 1
                        [activation_code] => 
                        [activated_at] => 
                        [last_login] => 
                        [persist_code] => 
                        [reset_password_code] => 
                        [created_at] => 2013-09-26 10:24:23
                        [updated_at] => 2013-09-26 10:24:23
                    )

答案 1

当您运行时,它将返回一个 Collection 对象。此集合以对象形式包含所有用户。因此,您的用户将包含其密码。这样您就可以出于任何原因显示散列密码。但是,如前所述,如果将“集合”或“用户”转换为数组或 JSON,则密码字段在隐藏时应消失。User::all()

因此,如果要摆脱它们,请尝试运行以下命令:

$array_of_users = Users::all()->toArray();
$json_of_users = Users::all()->toJson();

dd()这两者都检查它们。密码字段将消失。

这在Laravel关于序列化的文档中进行了解释。


答案 2

不,因为你不应该在生产(或现实世界)中做这样的事情。

用 Blade 编写的视图可以接收结果并进行处理,但这是 PHP(服务器),而不是 HTML(客户端),它会在将数据传递到客户端之前将其转换为 HTML。User::all()

所以这个

print_r(User::all())

这是你永远不会向用户展示的东西,这是我们用来调试的东西,但它实际上没有任何意义。

但是,如果您有任何其他示例,当敏感数据可以通过视图传递给您的客户时,我们也可以讨论。


推荐