使用时system()在 Perl 中调用,您是否必须转义 shell 参数,还是自动完成?
参数将是用户输入,所以我想确保这是不可利用的。
最佳答案
如果您使用 system $cmd, @args
而不是 system "$cmd @args"
(数组而不是字符串),那么您不必转义参数,因为没有调用 shell 程序(请参阅 system )。 system {$cmd} $cmd, @args
即使 $cmd 包含元字符并且 @args 为空(这被记录为 exec 的一部分)也不会调用 shell。如果 args 来自用户输入(或其他不受信任的来源),您仍然希望清除它们。见 -T
在 perlrun文档和 perlsec文档。
如果您需要读取输出或向命令发送输入,qx
和 readpipe
没有等价物。相反,使用 open my $output, "-|", $cmd, @args
或 open my $input, "|-", $cmd, @args
虽然这不是可移植的,因为它需要一个真正的 fork
这意味着只有 Unix ......我想。也许它的模拟叉可以在 Windows 上运行。更好的选择是类似 IPC::Run ,这也将处理管道命令到其他命令的情况,系统的多参数形式和 4 参数形式的 open 都无法处理。
关于perl - 我应该在 Perl 中转义 shell 参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/619926/