这是该问题的一个完美示例:分类器 gem 破坏 Rails。
**原始问题:**
作为一名安全专家,我关心的一件事是 Ruby 没有与 Java 的包隐私类似的东西。也就是说,这不是有效的 Ruby:
public module Foo
public module Bar
# factory method for new Bar implementations
def self.new(...)
SimpleBarImplementation.new(...)
end
def baz
raise NotImplementedError.new('Implementing Classes MUST redefine #baz')
end
end
private class SimpleBarImplementation
include Bar
def baz
...
end
end
end
能够防止 Foo::BarImpl 的猴子补丁真是太好了。这样一来,依赖图书馆的人就知道没有人弄乱它。想象一下,如果有人在你身上更改了 MD5 或 SHA1 的实现!我可以调用freeze
这些类,但我必须逐个类地进行,如果我对加载顺序不太小心,其他脚本可能会在我完成保护我的应用程序之前修改它们。
Java 为防御性编程提供了许多其他工具,其中许多在 Ruby 中是不可能的。(请参阅 Josh Bloch 的书以获得一个很好的列表。)这真的是一个问题吗?我是否应该停止抱怨并将 Ruby 用于轻量级的事情,而不是希望“企业就绪”的解决方案?
(不,核心类在 Ruby 中默认不被冻结。见下文:)
require 'md5'
# => true
MD5.frozen?
# => false