Как проверить правильность пути execuable в PHP? - PullRequest
0 голосов
/ 08 июня 2010

Я пишу сценарий установки / установки для своего приложения, в основном просто хороший интерфейс для файла конфигурации.Одной из переменных конфигурации является исполняемый путь для mysql.После того, как пользователь ввел его (например: /path/to/mysql-5.0/bin/mysql или просто mysql, если он находится в своей системной переменной PATH), я хочу убедиться, что это правильно.Моей первоначальной реакцией было бы попробовать запустить его с "--version", чтобы посмотреть, что вернется.Однако я быстро понял, что это приведет к тому, что я напишу следующую строчку кода:

shell_exec($somethingAUserHasEntered . " --version");

... что, очевидно, очень плохо.Теперь это установочный скрипт, который предназначен только для доверенных пользователей, и те, которые, вероятно, уже имеют относительно высокий уровень доступа к системе, но все же я не думаю, что вышеуказанное решение - это то, что я хочу написать.1008 * Есть ли лучший способ проверить путь к исполняемому файлу?Возможно тот, который не открывает огромную дыру в безопасности?

Ответы [ 4 ]

2 голосов
/ 08 июня 2010

Выполнение произвольных пользовательских команд похоже на выполнение запросов на основе пользовательского ввода ... Экранирование - это ключ.

Сначала проверьте, если это исполняемый файл, используя is_executable().

PHP предоставляет две функции для этого: escapeshellarg() и escapeshellcmd().

escapeshellarg() добавляет одинарные кавычки вокруг строки и заключает в кавычки / экранирует любые существующие одинарные кавычки, позволяя передавать строку непосредственно в функцию оболочки и обрабатывать ее как один безопасный аргумент.

escapeshellcmd() экранирует любые символы в строке, которые могут использоваться, чтобы обмануть команду оболочки при выполнении произвольных команд.

Это должно ограничить количество риска.

if(is_executable($somethingAUserHasEntered)) {
  shell_exec(escapeshellarg($somethingAUserHasEntered) . " --version");
}

В конце концов, выполнение rm --version не очень вредно, и "rm -rf / &&" --version очень быстро доставит вас куда угодно.


РЕДАКТИРОВАТЬ: Поскольку вы упомянули PATH ... Вот быстрая функция для проверки, если файл является исполняемым в соответствии с PATH правилами:

function is_exec($file) {
  if(is_executable($file)) return true;
  if(realpath($file) == $file) return false; // Absolute Path

  $paths = explode(PATH_SEPARATOR, $_ENV['PATH']);

  foreach($paths as $path) {
    // Make sure it has a trailing slash
    $path = rtrim($path, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
    if(is_executable($path . $file)) return true;
  }

  return false;
}
1 голос
/ 08 июня 2010

Вы можете попробовать простой вызов file_exists, чтобы определить, существует ли что-то в этом месте, вместе с is_executable, чтобы подтвердить, что это то, что вы можете запустить.

0 голосов
/ 23 марта 2013

system('which '.escapeshellarg($input)) даст вам абсолютный путь к исполняемому файлу, независимо от того, является ли он просто именем или абсолютным путем.

0 голосов
/ 08 июня 2010

вы смотрели на is_dir() или is_link() или is_file() или is_readable()

Надеюсь, что это поможет.

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