linux,允许用户只有一个带有changable变量的命令

时间:2015-04-29 07:09:23

标签: php linux shell restrictions restricted-profiles

我有2台服务器。第一个Web服务器另一个Linux服务器 在Web服务器上,我编写连接到linux服务器的php脚本,并在用户输入后运行命令。在这种情况下,在linux服务器上执行的命令不一样。例如:

<input type="text" name="input">

...

$user_input = $_POST["input"]

...

if (!($stream = ssh2_exec($con, "cat $user_input | grep some_text"))) {
            echo "fail: unable to execute command\n";
        } 

现在我必须允许用户只使用一个带有changable变量的命令。用户只能为ex提供。 “cat”和“grep”命令,但“$ user_input”每次都会更改。 有什么方法可以解决问题吗?

2 个答案:

答案 0 :(得分:0)

取决于您的代码...

cat $user_input | grep some_text

...您可能需要将用户输入限制为文件的一个特定路径,或者/或者可能包含一些额外的cat参数。

在这种情况下,你必须&#34;燃烧&#34;源代码中唯一的命令,清理/验证用户输入,以避免注入其他命令,如:

$user_input = "/dev/null; rm -rf /"

在这种情况下,您应该构建多步验证,以检查用户输入的不同方面以找出,如果这确实是一个路径。例如,一些正则表达式,如果这是典型的路径语法,则检查。如果有一些有效的输出,您也可以尝试pathinfo()作为验证的一部分。最后,如果用户输入只包含文件名,那么获得100%安全的chack非常困难。

请看这里:Determine via C# whether a string is a valid file path

答案 1 :(得分:0)

我所知道的唯一可靠(且相对安全)的方法是通过命令模板来实现。

概念。 Web前端不允许任意命令。相反,它提供了带有已检查/类型化参数的可能命令模板列表。在Web界面中,用户可以选择模板并指定参数。然后将所选择的模板和参数传递到后端,封装(例如,在经过验证的XML中)。后端首先验证用户提供的参数是否适合模板,然后编写命令,然后才执行它。

例如,使用您的代码段,可能的模板规范可能如下所示:

grep-file ::= cat <local-readable-file> | grep <safe-text>

对于local-readable-file参数,检查可能是,例如,文件名只包含安全字符,文件是常规文件,在本地文件系统上,任何人都可读。例如,对于safe-text,它确实只包含字母数字字符。