0

我有 2 台服务器。第一个 web 服务器另一个 linux 服务器。在网络服务器上,我编写了连接到 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";
        } 

现在我必须只允许用户使用一个带有可变变量的命令。用户只能给前。"cat" 和 "grep" 命令,但 "$user_input" 每次都会改变。有什么办法可以解决情况吗?

4

2 回答 2

0

根据您的代码...

cat $user_input | grep some_text

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

在这种情况下,您必须“刻录”源代码中唯一的命令并清理/验证用户输入以避免注入其他命令,例如:

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

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

看这里:通过 C# 确定字符串是否是有效的文件路径

于 2015-04-29T07:37:54.940 回答
0

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

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

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

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

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

于 2015-04-29T09:36:18.633 回答