0

我有一个加密文件file = File.new("encrypted.file", "r"),我想在解密后在 Ruby 中使用它。我不想解密、保存、要求和删除文件。

我现在要做的是:

str=""
file.each do |line|
     str+=line
end#do

str = doSomeDecryption(str)

我想以require str某种方式。有任何想法吗?eval(str)不是一种选择;它确实必须是“需要的”。

4

3 回答 3

1

严格来说,require 不是加载文件,而是加载资源;使用正确的 Kernel#require 重载,您几乎可以做任何事情。有些人制作了使用 open-uri 从远程服务器加载代码的版本。如果你想在纯 Ruby 中实现它,你需要使用eval. 有关其实现,请参见 http_require (https://github.com/astrails/http_require)。

如果您想将此作为扩展来实现,您可能能够减少潜在的攻击面,但您仍将实现 save-to-disk-then-require 或eval. (严格来说,虽然我现在无法在解释器中找到代码,但require它本身本质上是一个eval.)

于 2012-12-07T18:30:34.950 回答
0

是不是有一个邪恶的 eval :) 我不推荐使用它。

于 2012-12-07T16:17:59.617 回答
0

已经有各种库可以做到这一点:

  • require自动激活 Gems 的RubyGems 补丁
  • OCRA、Crate 和朋友补丁从加密的 SQLite 数据库等中require的列加载。TEXT

你可以在那里寻找他们如何解决这个问题。

Ruby 2.0 将有一个 API,允许您注册处理程序以挂钩到require进程中。

于 2012-12-07T19:48:53.707 回答