Laravel 隐藏属性。例如密码 - 安全
Posted
技术标签:
【中文标题】Laravel 隐藏属性。例如密码 - 安全【英文标题】:Laravel hidden attributes. e.g. Password - security 【发布时间】:2013-10-02 18:10:25 【问题描述】:根据http://laravel.com/docs/eloquent,可以通过在模型中使用受保护的 $hidden 变量来隐藏数组或 JSON 转换中的属性。
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] => 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】:当您运行User::all()
时,它会返回一个 Collection 对象。此集合包含您的所有用户对象形式。因此,您的用户将包含他们的密码。这样您就可以出于任何原因显示散列密码。但是,正如您之前所说,如果您将 Collection 或 Users 转换为数组或 JSON,则密码字段如果隐藏应该会消失。
因此,如果您想摆脱它们,请尝试运行以下命令:
$array_of_users = Users::all()->toArray();
$json_of_users = Users::all()->toJson();
dd()
这两个都检查它们。密码字段将消失。
这在 Laravel 的 serialization 文档中有解释。
【讨论】:
【参考方案2】:在 laravel 中,如果您在控制器中返回表示任何实体的任何模型对象,都将被转换为 JSON。 这对于创建 API 很有用,并且隐藏字段很有帮助
【讨论】:
【参考方案3】:不,因为您不应该在生产环境(或现实世界)中做类似的事情。
您用 Blade 编写的视图可以接收 User::all()
结果并对其进行处理,但这是 php(服务器),而不是 html(客户端),它会在将数据传递给客户端之前将其转换为 HTML。
所以这个
print_r(User::all())
这是你永远不会向用户展示的东西,它是我们用来调试的东西,但它真的没有任何意义。
但是,如果您有任何其他示例,当敏感数据可以通过视图传递给您的客户端时,我们也可以讨论。
【讨论】:
好吧...$user->password
怎么样
这取决于您是否在代码上使用。如果您认为这是敏感数据,请不要将其写入视图。 :)
我同意你的看法。但是为什么你可以通过 json 或数组请求自动保护它,而不是通过对象呢?
因为您不应该将对象发送到视图。在 MVC 模式中,视图应该接收与它们相关的数据,处理过的数据,而不是对象,因为它们不必了解您的业务逻辑。
您可以自动保护它,以便在运行 AJAX 请求时,您可以返回 User
对象的 JSON 字符串,而不必担心在发送之前将其删除。以上是关于Laravel 隐藏属性。例如密码 - 安全的主要内容,如果未能解决你的问题,请参考以下文章