我需要在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解决此问题。调用脚本时有类似的东西吗?
答案 0 :(得分:0)
如果您的脚本是可执行的,我相信您应该能够像这样构造命令:
String[] cmd = new String[] { runnerScript.getAbsolutePath(), Param1 };
这样,您正在调用脚本,并只是将参数传递给它;而不是调用bash -c
并传递一个字符串来执行,这本质上是不安全的。
要指定脚本应在哪个shell中运行,可以在脚本顶部放置#!/bin/sh
。
答案 1 :(得分:0)
出于类似的目的,请参考ProcessBuilder
。
请参阅:How to sanitize user input used in 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();
}