我需要在我的Java代码中调用一个Unix脚本,等待它执行,然后得到输出。脚本将执行"查找",用户将提供他希望"查找"查找的目录
String[] cmd = new String[] { "/bin/sh", "-c",
runnerScript.getAbsolutePath() + " " + Param1 };
Process p = Runtime.getRuntime().exec(cmd);
问题是:我怎样才能防止一个人输入' && rm -rf *'
或' / -exec rm..'
?
我有一个想法,例如检查服务器上是否存在该目录,或使用类似 isLetterOrDigit()
的方法,但我想知道是否存在更安全的方法。我知道对于 Sql 查询,我可以使用 PreparedStatement 来解决此问题。调用脚本时是否有类似的东西?
如果你的脚本是可执行的,我相信你应该能够像这样构造你的命令:
String[] cmd = new String[] { runnerScript.getAbsolutePath(), Param1 };
这样,你就可以调用你的脚本,只是给它传递参数;而不是调用bash -c
并传递给它一个字符串来执行,这本质上是不安全的。
若要指定脚本应在哪个 shell 中运行,可以将#!/bin/sh
放在脚本的顶部。
出于类似目的,请参阅ProcessBuilder
。
请参阅:如何清理 Runtime.exec(( 中使用的用户输入?
ProcessBuilder pb = new ProcessBuilder("ls", "-l");
try {
Process p = pb.start();
System.out.println("Executed");
while (p.isAlive())
{}
InputStream s = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(s));
StringBuilder builder = new StringBuilder();
String line = null;
while ( (line = reader.readLine()) != null) {
builder.append(line);
builder.append(System.getProperty("line.separator"));
}
String result = builder.toString();
System.out.println(result);
} catch (IOException e) {
e.printStackTrace();
}