PHP - 使用 Exec 执行带有用户定义参数的 Jar 文件

Posted

技术标签:

【中文标题】PHP - 使用 Exec 执行带有用户定义参数的 Jar 文件【英文标题】:PHP - Using Exec to execute Jar file with user defined parameters 【发布时间】:2011-03-04 17:24:40 【问题描述】:

我在 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() 以确保用户无法欺骗系统执行任意命令。

但在我的情况下,用户输入仅用作应用程序的参数,如果我不检查用户设置的内容,是否存在任何安全风险,除了如果用户输入字符串或浮点数,该程序将不会执行?

【问题讨论】:

【参考方案1】:

But in my case, where user input is used only as parameter for application

这就是你错的地方。 exec() 就像您在命令行上执行一行一样。如果用户输入如下内容:; rm -rf / && echo。您必须使用escapeshellargs() 转义输入。或者在将其传递给命令行之前更好地使用floatval()

【讨论】:

更好的是,使用 '; rm -rf ...' - 以防万一 Java 失败,rm 仍将继续运行 - 如果您正在破坏服务器,请不要很好地使攻击取决于您正在注入其参数的程序的成功. 添加了一个简单的test.txt并在最后一个参数末尾尝试了;del test.txt,并且;仍然被认为是java的参数?我用的是Win7,可能有另一个命令开始新指令? @Jernej Jerin 这与 java 无关,它是您使用的 shell。在这种情况下,exec() 正在使用 cmd.exe。 是的,我知道,但我在 cmd java -jar Clt.jar 1 100 1 && del test.txt 中尝试过,它确实删除了 test.txt,而由于某种原因,执行 exec 时使用完全相同的东西不想删除 test.txt?【参考方案2】:

当然。有很多 shell hack 可以让用户逃避你的命令并在你的系统上执行任意命令。使用 &&、管道等...

【讨论】:

【参考方案3】:

如果您不检查或转义注入到正在执行的命令行中的内容,则意味着任何人都可以向其中注入任何内容。这意味着在您的系统上执行任何类型的代码。而且,您可能会猜到,这可能是不好的

您必须始终正确地转义(尤其是)不安全的数据!

在构建要由系统执行的命令时,应使用escapeshellarg() 函数。

【讨论】:

以上是关于PHP - 使用 Exec 执行带有用户定义参数的 Jar 文件的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 替代 PHP 的 exec

php exec()

命令执行漏洞

PHP:exec()函数为啥没有反应呢?

命令执行漏洞

使用带有参数的 Maven 'exec:exec'