【发布时间】:2013-04-14 18:11:50
【问题描述】:
有几种方法可以从需要/加载该库的 Ruby 代码中访问库的源代码。在这些方式中,有的直接读取库文件并解析。其他人通过一些提供有关源信息的内置方法(例如抽象语法树)访问源。在我无法直接读取文件内容的情况下(如前一种方式),访问源的唯一方法是访问提供信息的内置方法。通过重新定义这些方法来做其他事情,我将完全放弃对源代码的访问。什么是最小的方法集,如果我将它们重新定义为其他东西,我将完全失去对外部文件上库源代码的访问权限?
重新表述问题
假设:
- 有一个用户可以在文件 A 中编写任何 Ruby 代码。
- 有一个我写的静态Ruby文件B,它加载文件A并调用A中定义的主例程,还定义了一些用户可以在A中使用的类/方法。
- 用户对 B 没有 +r(读取)或 +w(写入)权限。
我必须通过在文件 B 中写入来重新定义(无效)或删除哪些(标准 Ruby)方法,以使用户无法访问写入文件 B 中的源(通过用户可以编写的任何代码)在文件 A) 中当我运行文件 B 时?
有一些库,如 sorcerer、pry,可以提取它有权访问的方法的源代码。纯 Ruby 中必须有一些原始命令,这些库依赖这些命令才能访问源代码。是什么方法让这种事情成为可能?
如果您不知道完整的答案,但知道特定库如何提取某些方法的来源,那么这仍然会有所帮助。
【问题讨论】:
-
我认为您可以定义一些抽象类或类似于 Java 中的接口的东西,它不实现任何东西。该接口将从外部组件公开访问。然后可以继承抽象类在内部实现。
-
重新定义此类方法时,您可以使用
Module#alias_method来确保您拥有正在修改的原始方法的“副本”。 apidock.com/ruby/Module/alias_method -
system、backtick、fork/exec 等,将不得不被禁用。跨度>
-
等等。你想加载一个“插件”(想不出更好的词),然后通过做一些疯狂的沙箱来阻止它读取你的应用程序的源代码?在另一个进程中对代码进行沙箱处理,使用内置/C 级别的操作系统沙箱功能(我知道 Linux 有这些功能)并执行一些 IPC 会更容易吗?
-
s/sourcerer/sorcerer?
标签: ruby metaprogramming