【发布时间】:2015-11-25 00:04:11
【问题描述】:
我有一个 Json 结构,例如:
{
"field1" => "one",
"field2" => "two",
...
}
我用的是perl的Json模块,可以祝福返回给我的Json变成一个类,比如:
my $result = bless($json->{output},'MyClass')
到目前为止一切顺利 - 现在我可以在 MyClass.pm 中创建方法来返回 field1、field2 等的值。
所以似乎通过bless,我可以直接访问设置对象的属性。但危险是我也可以在代码后面做一些事情,比如:
$result->{field1} = "anythingIwant";
...这不太好。我知道我可以设置像_field1 这样的属性来表示隐私,但这并不妨碍我做$result->{_field1} = "anythingIwant";
那么 perl 中是否有处理这种情况的最佳实践方法?换句话说,能够bless Json输出成一个类进行反序列化是超级方便的,但也显得很危险。我正在寻找两全其美的方法,我仍然可以使用 bless 但也可以防止任何客户端代码执行上述anythingIwant 场景。我研究过 Moose、InsideOut 等,但我不确定其中任何一个是否符合要求或只是引入更多复杂性。
【问题讨论】:
-
常见的解释是 Perl 很好地要求你不要离开它的院子。它不会拿着霰弹枪站在门口。甚至 Moose 通常也会在后台使用祝福哈希。一个由内而外的解决方案可以变得更加防弹,但代价是更难以进入 Perl 的类所期望的典型结构(例如,继承变得更加棘手)。
-
是的,有:不要这样做
$result->{field1} = "anythingIwant";。我不是在开玩笑。最佳实践就是不要从类外部访问对象的内部。 -
你真的声称有人可能会不小心写
$result->{field1} = "anythingIwant"吗?或者您在问如何保护您的数据免受恶意攻击? -
@DavidO/ikegami - 我开始接受 perl 只是以不同的方式处理这些类型的事情 (oop),实际上它更多的是关于对对象的期望管理。
标签: json perl oop private-members bless