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



我需要在我的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();
}

最新更新