【问题标题】:How do I prevent the system command in Perl from executing any shell commands?如何防止 Perl 中的系统命令执行任何 shell 命令?
【发布时间】:2026-01-21 13:45:01
【问题描述】:

如何防止 Perl 中的系统命令执行任何 shell 命令?

【问题讨论】:

  • 如果您询问此问题的目的是为了安全,请务必同时考虑 qxexec。你可能会在perldoc.perl.org/perlsec.html 中找到一些答案——尽管这解释了如何安全地调用system,而不是如何防止某些东西调用system 或防止system 做某事。
  • 您能更具体地说明您要做什么吗?

标签: perl


【解决方案1】:

如果您不希望 system 运行 shell 命令,请不要使用 system,因为这就是它的作用。

如果您说的是只运行您想要运行的命令,那么有多种方法可以解决这个问题。我在 Mastering Perl 的安全章节中谈到了其中的一些。但是,您必须澄清您要避免的问题。

【讨论】:

  • 对不起,我的意思是我需要允许一些命令,但不是全部
【解决方案2】:

要求在路径中找到它们。路径上的可执行文件不是 shell 命令。

【讨论】:

  • 也就是说,直到有人将 shell 脚本插入其中一个目录。仅仅要求它在 PATH 中只是一个减速带。
  • @brian,好吧,他没有提到他为什么不想运行 shell 命令,所以我不得不在那里回填。我想出的原因之一是 shell 命令在给定平台上可能会失败,因为它们只在 shell 中有效。
【解决方案3】:

您可以通过为CORE::GLOBAL::system 设置别名来模拟system

BEGIN {
    *CORE::GLOBAL::system = \&mock_system;
}

sub mock_system {
    my @cmd = @_;
    if ("@cmd" eq "/bin/ls /tmp") {
        return CORE::system(@cmd);
    } else {
        warn "You may only use 'system' to list the /tmp directory";
        return 256;
    }
}

不过,这并不能保护您免受有人明确调用 CORE::system 的伤害。

【讨论】: