使用用户插入的变量清理 exec 命令的最佳方法

2022-08-30 23:25:36

我正在为我们公司使用的一个可怕的裙带关系软件编写一个Web界面。该软件没有真正的UI,需要我们向客户提供对系统进行腻子访问,以便我们的客户甚至提取数据。我的Web界面必须运行一个函数,它必须传递用户输入的几个变量。exec();

$command = "report-call '$type' '$study' '$server' '$tag' '$specopt1' '$specopt2' '$specopt3' '$specopt4'";
$last_line = exec($command, $output, $returnvalue); 

现在我想我也许可以从变量中删除任何分号并安全,但我不确定,这就是为什么我在下个月上线之前在这里摆姿势。$command

消毒的最佳方法是什么?我确实需要在变量中使用一些特殊的字符 。$command[ ] < > ! # $


答案 1

为此,请使用 PHP 的函数:

$cmd = 
     "/usr/bin/do-something " . 
     escapeshellarg($arg1) . 
     ' ' . 
     escapeshellarg($arg2);

您还可以使用escapeshellcmd()

有什么区别?

escapeshellarg()只在字符串周围添加 ',然后在任何其他 ' 字符之前添加 \。http://www.php.net/escapeshellarg

escapeshellcmd()转义所有对 shell 敏感的字符($、\ 等),但不添加引号。http://www.php.net/manual/en/function.escapeshellcmd.php

该 gotcha 是用作 QUOTE 参数的一部分的情况。然后它被渲染为无用(实际上在混合中添加引号)。escapeshellarg()

一般来说,我们更喜欢使用自己的引号。escapeshellcmd()

$cmd = 
    "/usr/bin/do-something '" . 
    escapeshellcmd($arg1) . 
    "' '" . 
    escapeshellcmd($arg2) . 
    "'";

注意安全!


答案 2

推荐