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

如何防止Perl中的系统命令执行任何shell命令?,perl,Perl,如何防止Perl中的系统命令执行任何shell命令?要求在路径中找到它们。路径上的可执行文件不是shell命令 要求在路径中找到它们。路径上的可执行文件不是shell命令 如果您不想运行shell命令,请不要使用system,因为这就是它要做的 如果你说的是只运行你想运行的命令,那么有多种方法可以解决这个问题。我在掌握Perl的安全性一章中讨论了其中的一些。但是,您必须澄清您试图避免的问题。如果您不想运行shell命令,请不要使用system,因为这就是它要做的 如果你说的是只运行你想运行的命令

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

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

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

如果您不想运行shell命令,请不要使用
system
,因为这就是它要做的

如果你说的是只运行你想运行的命令,那么有多种方法可以解决这个问题。我在掌握Perl的安全性一章中讨论了其中的一些。但是,您必须澄清您试图避免的问题。

如果您不想运行shell命令,请不要使用
system
,因为这就是它要做的


如果你说的是只运行你想运行的命令,那么有多种方法可以解决这个问题。我在掌握Perl的安全性一章中讨论了其中的一些。但是,您必须澄清您试图避免的问题。

您可以通过将别名设置为
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

您可以通过设置
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;
    }
}

这不会保护您不显式调用<代码>核心::系统< /代码>。

如果您的请求是关于安全性的,请务必考虑<代码> QX和<代码> Exc< /COD>。您可能会在中找到一些答案-虽然这解释了如何安全地调用
系统
,而不是如何阻止某些东西调用
系统
或阻止
系统
做某些事情。您能更具体地说明您试图做什么吗?如果您问这个问题的目的是为了安全,请务必考虑<代码> QX和<代码> Exc< <代码>。您可以在中找到一些答案-尽管这解释了如何安全地调用
系统
,不是如何阻止某些东西调用
系统
或阻止
系统
做某事。你能更具体地说明你想做什么吗?对不起,我的确切意思是我需要允许一些命令,但不是所有命令对不起,我的确切意思是我需要允许一些命令,但不是所有命令是,直到有人将shell脚本插入其中一个目录。仅仅要求它在路径中只是一个减速器。@brian,他没有提到为什么他不想运行shell命令,所以我不得不回到那里。我提出的原因之一是,shell命令可能在给定平台上失败,因为它们仅在shell中有效。也就是说,直到有人将shell脚本插入其中一个目录。仅仅要求它在路径中只是一个减速器。@brian,他没有提到为什么他不想运行shell命令,所以我不得不回到那里。我想到的一个原因是shell命令可能在给定平台上失败,因为它们只在shell中有效。