Предотвратить вредоносный ввод для выполнения при вызове скрипта - PullRequest
1 голос
/ 31 мая 2019

Мне нужно вызвать сценарий Unix в моем коде Java, дождаться его выполнения и получить вывод.Сценарий выполнит «поиск», а пользователь предоставит каталог, в котором он хочет найти «поиск», в

String[] cmd = new String[] { "/bin/sh", "-c",
                              runnerScript.getAbsolutePath() + " " + Param1 };
Process p = Runtime.getRuntime().exec(cmd);

Проблема заключается в следующем: как я могу запретить вводу ' && rm -rf *' или ' / -exec rm..'?

У меня есть идея, например, проверить, существует ли каталог на сервере, или использовать метод, подобный isLetterOrDigit(), но я хочу знать, существует ли более безопасный путь.Я знаю, что для Sql Query я могу использовать PreparedStatement, чтобы обойти эту проблему.Есть ли что-то подобное при вызове скрипта?

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

См. 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();
}
0 голосов
/ 31 мая 2019

Если ваш скрипт исполняемый, я считаю, что вы должны иметь возможность построить свою команду следующим образом:

String[] cmd = new String[] { runnerScript.getAbsolutePath(), Param1 };

Таким образом, вы вызываете свой скрипт и просто передаёте ему параметр; вместо вызова bash -c и передачи ему строки для выполнения, что небезопасно по своей сути.

Чтобы указать, в какой оболочке должен запускаться ваш скрипт, вы можете поставить #!/bin/sh вверху скрипта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...