哪些方法可以访问源代码?

2024-02-15

有多种方法可以从需要/加载该库的 Ruby 代码中访问该库的源代码。其中,有的直接读取库文件并解析。其他人通过一些内置方法访问源代码,这些方法提供有关源代码的信息(例如抽象语法树)。在我无法直接读取文件内容的情况下(如前面的方式),访问源的唯一方法是通过访问提供信息的内置方法。通过重新定义这些方法来执行其他操作,我将完全放弃对源代码的访问。最少的方法集是什么,如果我将它们重新定义为其他内容,我将完全失去对外部文件上库源代码的访问?


To rephrase the question

Suppose:

  • 有一个用户可以在文件 A 中编写任何 Ruby 代码。
  • 有一个我写的静态Ruby文件B,它加载文件A并调用A中定义的主例程,并且还定义了用户可以在A中使用的一些类/方法。
  • 用户对 B 没有 +r(读)或 +w(写)权限。

我必须重新定义(无效)或通过在文件 B 中写入来删除哪些(标准 Ruby)方法,以便用户无法访问文件 B 中写入的源代码(通过用户可以在文件 A 中写入的任何代码) )当我运行文件B时?

有一些库,如 sorcerer、pry,可以提取它有权访问的方法的源代码。这些库依赖于纯 Ruby 中的一些原始命令来访问源代码。有哪些方法可以使这种事情成为可能?

如果您不知道完整的答案,但知道特定的库如何提取某种方法的源代码,那么这仍然会有帮助。


TL;DR: Ruby-only 解决方案只能使用source_location,所以只需重新定义它即可返回类似的内容['/some/empty/file', 1]。对解释器的 C hack 不使用source_location,但您可以通过阻止/白名单来阻止任何 C 扩展的使用require和朋友。


其一,为了能够执行 Ruby 脚本,您必须能够读取它......

但回到问题。我知道Sourcify除了Proc和Method上的一个小方法之外没有使用任何神秘的方法source_location,它给出了定义方法/过程的文件名和行号。我从经验中知道,这种方法非常脆弱,需要编写某种解析器,并且仅有时在合法情况下有效。所以,如果你重新定义,Sourcify 已经出局了source_location在 B 中返回类似的东西/dev/null, line 0并让 Source 抛出一个非 Ruby 源异常。

来自普里的source https://github.com/pry/pry/blob/master/lib/pry/method.rb#L551-L566,看来 Pry 使用的是相同的source_location办法,于是二鸟同石。

现在,所有这些库都有另一个选择,即下降到 C 并破解解释器以记录源代码。这几乎是完美无缺的。但我们仍然可以通过一种非常简单的方法来避免危险。有人可以在 A 中包含 Pry 方法源的所有代码。但是如果不需要 C 库,则无法包含内联 C/C 扩展。所以,解决方案很明显:重新定义require and require_relative and load要么不起作用,要么只允许某些库。这样,您就可以抵御 C 黑客攻击。

在 MRI 上,除此之外没有其他办法(来自 Ruby 代码)source_location去做这个。那么就这样吧!

Edit:根据 @banister 的说法,从 MRI 2.0+ 来看,有一个binding_of_caller可以替换源位置的内置方法。也核爆这个。 ;)

Warning: Ruby 不是一个很好的语言。如果您可以对它们进行元编程,那么它们也可能可以对您进行元编程,除非您处于不同的进程中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哪些方法可以访问源代码? 的相关文章

随机推荐

  • System.Web.Caching 还是 System.Runtime.Caching 对于 .NET 4 Web 应用程序来说更可取

    我正在向 ASP NET Web 应用程序添加缓存 这是 NET 4 因此我可以使用 System Runtime Caching 命名空间中的类 据我所知 添加该命名空间是为了提供与 System Web Caching 中的功能类似的功
  • JPA 标准 API。使用带参数的 sql 函数调用进行查询

    我正在尝试使用 Criteria typesafe API 构建此查询 select from xxx table xxx where CALC DISTANCE xxx latitude xxx longitude lat lng lt
  • PHP 标头在新窗口中重定向?

    对于横幅管理系统 我使用 header Location http www awebsite com 重定向到正确的网站 是否可以强制此标头脚本在新窗口中打开 a href yourbannerscript php target blank
  • 最好的 iPhone 游戏,有可供初学者学习的源代码

    您会推荐初学者学习的最好的带有源代码的 iPhone 游戏是什么 不确定它是否是最好的 但 iOS 上的一款著名游戏刚刚开源 Canabalt https github com ericjohnson canabalt ios https
  • 是否有一个 Python 库可以在提供邮政编码时返回城市?

    因此 我的数据框中有邮政编码 我想在其中构造另一列 其中包含根据邮政编码的城市名称 如果我也可以提取其他信息 例如状态 那就太好了 目前我只需要德国这样做 但在不久的将来其他欧洲国家也需要这样做 我找到了一些可能的解决方案 但它们似乎仅适用
  • 为什么 Alert 函数的执行速度比 javascript 中的任何其他函数都快?

    据我所知 代码执行是从上到下开始的 在下列情况下 为什么alert 函数的执行速度比之前找到的代码行要快 Case 1 Alert 比console log console log Why was I executed last alert
  • 在 JTextFIeld 中隐藏/显示密码 (Java Swing)

    因此 我一直在研究密码强度检查器 它的工作方式是用户在文本字段中输入一些随机文本 然后显示即时视觉反馈 点的细分 我还添加了一个复选框 选中该复选框后 应隐藏密码 即用星号替换所有字符 同时保留用户输入的实际文本 文档侦听器用于跟踪文本字段
  • 替换MySQL中的所有字段

    我需要使用以下命令替换表列中的一些字符REPLACE命令 我知道REPLACE命令需要列名 然后是要更改的文本 在以下示例中为 a 字符 和新文本 在以下示例中为 e 字符 UPDATE my table SET my column REP
  • 动态捕获 CPU 和内存使用情况

    我正在运行 shell 脚本来执行 C 应用程序 该应用程序测量 api 的性能 我可以捕获 API 的延迟 返回给定参数集的值所需的时间 但我也希望以 5 10 秒的间隔捕获 CPU 和内存使用情况 有没有一种方法可以做到这一点 而又不会
  • 如何与其他进程共享现有的 char * ?

    我正在尝试使用其他分叉 执行的进程共享一些内存shmget and shmat char test test int shID char shptr key t shkey 2404 shID shmget shkey sizeof cha
  • PAnsiChar 和 PChar 的区别

    PAnsiChar 和 PChar 之间有区别吗 是什么类型 德尔福2007年之前 先感谢您 D2009 及之后 是的 有 PChar是一个指向 a 的指针Char这是一个 unicode 字符 aWideChar And PAnsiCha
  • 如何启用 PostgreSQL 函数分析器?

    这花了我一段时间才弄清楚 几周前我在一个外语维基上找到了答案 它非常有帮助 所以我想我会分享 在 Win32 上的 PostgreSQL 8 3 上 默认情况下会安装分析插件 但不会加载 只需执行以下 SQL LOAD libdir plu
  • 如何设计轮播点样式?

    我如何将我的旋转木马点设计成这样 这是我现在所拥有的 这是我的风格 slick dots position absolute bottom 45px list style none display block text align cent
  • 在生产 Java 服务器中打开 GC 日志记录是常见做法吗?

    我在一些地方 1 看到人们在生产服务器 关键任务 中启动 GC 日志记录 例如 java server Xms1024m Xmx1024m XX NewSize 256m XX MaxNewSize 256m XX UseConcMarkS
  • 当我点击它们时如何更改圆半径(使用 Three.js)?

    我有以下 JavaScript 代码 取自一个示例 它绘制了一些圆圈 当您单击其中一个圆圈时 它会改变颜色 但我还想在单击该圆圈时更改该圆圈的半径 大小 并保持其他圆圈不变 这文档 https threejs org docs index
  • 如何解码 HTML 实体?

    这是一个 Perl 快速问题 如何转换 HTML 特殊字符 例如 uuml or 039 转换为普通 ASCII 文本 我从这样的事情开始 s d chr 1 eg 并且可以为所有 HTML 字符编写它 但是像这样的函数可能已经存在 请注意
  • 在按下和释放鼠标时绘制矩形,opengl

    我试图根据用户输入绘制一个矩形 该矩形从左键单击收集 x1 y1 坐标 然后从左键单击的释放指定 x2 y2 我成功保存了基于此鼠标操作的坐标 基于确认保存坐标的 cout 这是我尝试过的 请记住 没有任何崩溃 因此存在逻辑错误 void
  • 如何使用 Factorplot 用分类值注释条形或绘制 4 个变量?

    我有一个要绘制的数据框 我想到了两个选择 检查图像 对于选项 1 我需要注释一个分类值 Elec 对于选项 2 我仍然需要使用 factorplot 但我不知道如何修复收到的错误 CODE FOR THE DATAFRAME raw dat
  • Bootstrap 4 有内置水平分隔线吗?

    Bootstrap 4 有内置水平分隔线吗 我可以做这个 但我想使用内置的 bootstrap css 我在文档中找不到它 也许我错过了它 HTML 已经有一个内置的水平分隔符 称为 hr 水平规则 的缩写 Bootstrap 风格像这样
  • 哪些方法可以访问源代码?

    有多种方法可以从需要 加载该库的 Ruby 代码中访问该库的源代码 其中 有的直接读取库文件并解析 其他人通过一些内置方法访问源代码 这些方法提供有关源代码的信息 例如抽象语法树 在我无法直接读取文件内容的情况下 如前面的方式 访问源的唯一