Возможно, в текущем тестовом коде вы можете рассуждать о том, что здесь на самом деле нет возможности злоупотребления, но я сомневаюсь, что это рабочий код с жестко заданным паролем «123». Подобный код имеет тенденцию изменяться, и если вы оставляете потенциал для инъекции, вы должны знать слишком много о том, откуда поступают все параметры, чтобы иметь возможность исключить инъекцию. Если вы делаете это правильно, вам не нужно быть очень осторожным с параметрами.
Кроме того, сканеры уязвимостей не могут быть такими умными. Кто знает, что ищет Sonar, но жалуется на этот конкретный вариант конструктора ProcessBuilder. Возможно, он может распознавать пробелы во входной строке и знать, что там есть параметры. Кто знает. Несмотря на это, на самом деле нет никаких причин не использовать более надежную версию конструктора. Я ожидаю, что это позволит избежать этого сообщения.
Как и в случае с SQL, ответ заключается в передаче отдельных параметров в ProcessBuilder, например:
void assign(String path, File jarFile) throws IOException {
File cert = new File(path, "Cert");
String password = "123";
File script = new File(path, "assign.bat");
String[] command = {
script.getAbsolutePath(),
password,
cert.getAbsolutePath(),
jarFile.getAbsolutePath()
};
Process proc = new ProcessBuilder(command).start();
}
Это гарантирует, что код знает разницу между самим исполняемым файлом и параметрами, и поэтому не так легко манипулировать исполняемым файлом. Это также делает этот конкретный код чище и легче для чтения.
Обратите внимание, что даже в этом случае, чтобы быть уверенным, что этот код безопасен, вам необходимо точно знать поведение File.getAbsolutePath () и / или точно, где находятся пути и jarFile. приходящий из. Возможно, что File можно будет манипулировать, чтобы вернуть что-то плохое из getAbsolutePath . Я не говорю, что это возможно, но тот факт, что я не знаю, в любом случае, именно поэтому я хотел бы использовать многострочный вариант конструктора ProcessBuilder.
ОБНОВЛЕНИЕ: Итак, Сонар все еще жалуется на эту форму. Оказывается, что эта новая версия все еще использует тот же конструктор, потому что конструктор является конструктором varargs, который может принимать «одну или несколько» строк. Я думаю, что оригинальное решение, которое я предоставил, действительно решает проблему внедрения, но Сонар не может распознать тот факт, что мы разделили аргументы команды.
Есть конструктор ProcessBuilder, который принимает список вместо массива. Эта версия моего примера использует этот конструктор.
void assign(String path, File jarFile) throws IOException {
File cert = new File(path, "Cert");
String password = "123";
File script = new File(path, "assign.bat");
String[] command = {
script.getAbsolutePath(),
password,
cert.getAbsolutePath(),
jarFile.getAbsolutePath()
};
List<String> commandList = Arrays.asList(command);
Process proc = new ProcessBuilder(commandList).start();
}
Надеюсь, это радует сонара. Я предполагаю, что этот способ построения ProcessBuilder - это то, что он ищет.