Java PHP-使用Exec执行带有用户定义参数的Jar文件
我有一个在php中工作的exec,它执行一个Jar文件并返回结果:Java PHP-使用Exec执行带有用户定义参数的Jar文件,java,php,security,exec,Java,Php,Security,Exec,我有一个在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]);
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]);
现在我需要知道是否需要检查用户输入,因为在PHP页面的exec下,它显示:
允许将用户提供的数据传递到此函数时,请使用escapeshellarg()或escapeshellcmd()确保用户无法欺骗系统执行任意命令
但在我的例子中,用户输入仅用作应用程序的参数,如果我不检查用户设置了什么,是否存在任何安全风险,除了如果用户输入字符串或浮点数,程序将不会执行之外?
但在我的例子中,用户输入仅用作应用程序的参数
这就是你错的地方
exec()
就像是在命令行上执行一行。如果用户输入类似于:;rm-rf/&echo
。必须使用escapeshellargs()
对输入进行转义。或者最好在将其传递到命令行之前使用floatval()。有很多shell黑客可以让用户逃避您的命令并在您的系统上执行任意命令。使用&&、管道等。如果您不检查或转义您正在执行的命令行中注入的内容,这意味着任何人都可以向其中注入任何内容。这意味着在您的系统上执行任何类型的代码。而且,正如你可能猜到的,这可能是不好的
您必须始终正确地转义(尤其是)不安全的数据
在生成要由系统执行的命令时,应该使用该函数。更好的是,使用';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?