防止在脚本调用时执行恶意输入

时间:2019-05-31 09:49:55

标签: java unix

我需要在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解决此问题。调用脚本时有类似的东西吗?

2 个答案:

答案 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();
}