这是问题的一个完美示例:分类器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
Jörg W Mitta.. 9
我不认为这是一个问题.
是的,神秘的"某人"可以用不安全的东西取代MD5的实现.但是为了做到这一点,神话中的某个人实际上必须能够将他的代码放入Ruby进程中.如果他能做到这一点,那么他可能也会将他的代码注入Java进程,例如重写MD5操作的字节码.或者只是拦截按键,实际上根本不打扰使用密码学代码.
一个典型的问题是:我正在编写这个很棒的库,应该像这样使用:
require 'awesome' # Do something awesome.
但如果有人像这样使用它会怎么样:
require 'evil_cracker_lib_from_russian_pr0n_site' # Overrides crypto functions and sends all data to mafia require 'awesome' # Now everything is insecure because awesome lib uses # cracker lib instead of builtin
简单的解决方案是:不要那样做!教育您的用户不要运行他们从安全关键应用程序中的模糊源下载的不受信任的代码.如果他们这样做,他们可能应得的.
回到Java示例:在Java中,您可以创建加密代码private
,final
而不是.但是,有人仍然可以替换您的加密实现!事实上,有人确实做过:许多开源Java实现使用OpenSSL来实现其加密例程.而且,正如您可能知道的那样,Debian多年来一直在发布一个破碎,不安全的OpenSSL版本.因此,在Debian上运行,在过去几年中所有Java程序实际上也有不安全的加密运行!
我不认为这是一个问题.
是的,神秘的"某人"可以用不安全的东西取代MD5的实现.但是为了做到这一点,神话中的某个人实际上必须能够将他的代码放入Ruby进程中.如果他能做到这一点,那么他可能也会将他的代码注入Java进程,例如重写MD5操作的字节码.或者只是拦截按键,实际上根本不打扰使用密码学代码.
一个典型的问题是:我正在编写这个很棒的库,应该像这样使用:
require 'awesome' # Do something awesome.
但如果有人像这样使用它会怎么样:
require 'evil_cracker_lib_from_russian_pr0n_site' # Overrides crypto functions and sends all data to mafia require 'awesome' # Now everything is insecure because awesome lib uses # cracker lib instead of builtin
简单的解决方案是:不要那样做!教育您的用户不要运行他们从安全关键应用程序中的模糊源下载的不受信任的代码.如果他们这样做,他们可能应得的.
回到Java示例:在Java中,您可以创建加密代码private
,final
而不是.但是,有人仍然可以替换您的加密实现!事实上,有人确实做过:许多开源Java实现使用OpenSSL来实现其加密例程.而且,正如您可能知道的那样,Debian多年来一直在发布一个破碎,不安全的OpenSSL版本.因此,在Debian上运行,在过去几年中所有Java程序实际上也有不安全的加密运行!