2013-09-26 29 views
12

根据http://laravel.com/docs/eloquent,可以通过在模型中使用受保护的$隐藏变量隐藏数组或隐藏属性。Laravel隐藏属性。例如密码 - 安全

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

大,但是在运行时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] => [email protected] 
         [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 
        ) 

回答

20

当您运行User::all()时,它返回一个Collection对象。此收藏集包含对象形式为的所有用户。因此,您的用户将包含他们的密码。这样你就可以出于任何原因显示哈希密码。但是,正如您之前所说的,如果将Collection或Users转换为数组或JSON,则密码字段应该隐藏,如果隐藏。

因此,如果你想摆脱他们,尝试运行以下:

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

dd()这些既要检查它们。密码字段将消失。

这在Laravel的文档serialization中有解释。

3

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

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

所以这

print_r(User::all()) 

的东西,你永远不会做展现给用户,这是我们用来调试的东西,但它确实意味着什么。

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

+0

好的......'$ user-> password'怎么样? – Gravy

+0

这是你自己决定使用的代码。如果您认为这是一个敏感数据,请勿将其写入视图。 :) –

+0

我同意你的意见。但是,那么为什么你能够通过json或数组请求自动保护它,但不能通过对象? – Gravy

0

在laravel中,如果返回控制器中任何表示任何实体的模型对象都将转换为JSON。
这对于API创建很有用,并且隐藏字段可以帮助很多