【问题标题】:Block inclusion of a Perl module unless explicitly included除非明确包含,否则阻止包含 Perl 模块
【发布时间】:2020-08-04 17:20:24
【问题描述】:

我有一个 Perl 应用程序,它在两种情况下使用:它可以用作显示系统信息的诊断工具,或用作向该系统发送 Modbus 命令的测试工具。我遇到的问题是允许用户在诊断上下文中向系统发送命令存在潜在的安全风险,因此我想创建两个可执行文件:一个包含 Modbus 模块的测试版本和一个不包含 Modbus 模块的诊断版本。

我目前的解决方案是像这样包含 Modbus 模块:

BEGIN { eval { require Modbus; }; Modbus->import; }

这仅包括 Modbus 模块,如果我在使用 PAR Packager 构建 .exe 时使用选项 -M Modbus。这种方法的问题是它会失败,除非这是 only 导入 Modbus 的地方。因此,如果出现另一个不知道此风险的开发人员,只需一个 require 语句即可绕过此修复。

我是否有办法阻止特定模块包含在可执行文件中,除非我明确希望它包含(使用 -M 选项或其他方法)?我一直在尝试用 Devel::Hide 解决问题,但运气不佳。到目前为止,我发现的所有解决方案都未能通过“其他不了解此情况的开发人员”测试。

我使用的是 Strawberry Perl 5.20.3.3,但如有必要,我可以升级。

【问题讨论】:

  • 您能否提供一个可重复的小例子来说明您正在做什么。可能有助于为您找到解决方案。
  • 除了发布专有源代码之外,我不确定能否提供更多详细信息。我有一个模块可用于在某些情况下做不安全的事情,我需要一种方法来防止该模块在不依赖未来开发人员意识到风险的情况下使用。生成两个不同的可执行文件是可行的,但我需要一种方法来排除更难被意外破坏的危险模块。
  • 使用 OOP 的强大功能。如果需要,请创建对象。
  • @k-mx 我不清楚这有什么帮助。你能说得更具体点吗?

标签: perl


【解决方案1】:

当我完成这种事情时,我创建了一个小模块,如果它存在则包含,如果不包含则不包含:

 eval { require MaybeItsThere }

在我的 Makefile(或您想要的任何构建系统)中,我有开发和生产构建的目标。开发构建的子任务之一创建 MaybeItsThere 文件。它还可以为 PERL5LIB 等设置所需的任何内容,这样只有开发版本才能加载它。

但是,正如您所说,有进取心的开发人员可以快速找出他们需要做什么才能获得他们想要的功能。

【讨论】:

  • 我不清楚这有什么帮助。我可以制作任何我想要的构建脚本,但我不能强迫人们使用它们。我知道我无法防止故意颠覆,但我至少应该能够防止偶然的无知。
  • 您说您正在制作可执行文件。构建脚本适合您。
  • 我不是唯一的开发人员,而且我已经让另一个开发人员搞砸了一次。如果我有办法让可执行文件无法构建,除非使用正确的构建脚本,那也可以。
  • 我不知道您在做什么,但只有一个构建脚本,您可以键入make devmake user 来决定要构建哪个可执行文件。构建脚本是为您管理所有复杂性的单一入口点。在这些目标的背后,你做任何你需要做的事情来获得你想要的结果。
  • 这一切都很好,直到有人不知道为什么这很重要。正如我所说,这种情况已经发生过一次:另一个开发人员在代码中的其他位置导入了 Modbus 模块,并使用“pp Program_Name.pl”而不是使用正确的脚本构建了可执行文件,导致模块在不应该被包含时被包含在内是。有没有办法让我执行正确的构建程序,还是我只需要尽可能地标出这种危险?
【解决方案2】:

在阅读了您的 cmets 之后,您似乎无法强制正确使用。 (您举例说明了该模块如何被绕过您的构建过程的人滥用。)我建议另一种方法。

记录问题在那个地方有人会找到解决方法。

换句话说,如果其他开发人员要查看代码或构建以查看丢失模块的名称,请让他们看到有关危险的警告就在此处。放置一个注释块来解释为什么 Modbus 模块应该只在诊断被禁用或过滤时使用。使构建失败在与缺失模块名称相同的位置发出警告;使用die "Modbus should not be used when user interaction is enabled."; 或类似的东西在其他开发人员寻找解决方案的地方传达信息。

最终,您不能强迫某人使用您的构建工具,但您可以在他们试图解决您的问题时尝试教育他们,而不是在他们可能看不到的其他地方记录问题。

【讨论】:

  • 我已经尽我所能做到了。事后看来,这个功能真的应该被拆分成一个新工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-12
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多