我在php中有一个工作exec执行Jar文件并返回结果:
exec('java -jar Clt.jar ' . $sampleSize . ' ' . $numberOfSamples . ' ' . $randAlgorithm, $output);
在Java应用程序中以下列方式检查这些参数:
int sampleSize = Integer.parseInt(args[0]);
int numberOfSamples = Integer.parseInt(args[1]);
int randGenerator = Integer.parseInt(args[2]);
现在我需要知道如果我需要检查用户输入,因为在exec下的PHP页面上,它说:
当允许将用户提供的数据传递给此函数时,请使用escapeshellarg()或escapeshellcmd()以确保用户不会欺骗系统执行任意命令。
但在我的情况下,用户输入仅用作应用程序的参数,是否有任何安全风险如果我不检查用户设置的内容,那么如果用户输入字符串或浮点数,该程序将不会执行?
答案 0 :(得分:2)
But in my case, where user input is used only as parameter for application
这就是你错了。 exec()
就像在命令行上执行一行一样。如果用户输入的内容如下:; rm -rf / && echo
,该怎么办?您必须使用escapeshellargs()
转义输入。或者在将floatval()
传递给命令行之前更好地使用{{1}}。
答案 1 :(得分:0)
绝对。有很多shell hacks可以让用户逃脱命令并在你的系统上执行任意命令。使用&&,管道等......
答案 2 :(得分:0)
如果你没有检查也没有逃避你正在执行的命令行注入的内容,这意味着任何人都可以注入任何东西。这意味着在您的系统上执行任何类型的代码。并且,正如您可能猜到的那样,这可能是糟糕。
您必须始终正确转义(特别是)不安全的数据!
构建要由系统执行的命令时,应使用escapeshellarg()
函数。