Безопасность выполнения команды из php

Я пишу веб-приложение, в котором я использую несколько сторонних команд, вызывающих их с помощью функции exec в PHP (например, я обрабатываю формулы Latex с помощью командной строки).

Мой вопрос: каковы проблемы безопасности при выполнении внешних программ командной строки в php? О чем я должен знать? Можете ли вы дать мне список очков для проверки?

EDIT: Я знаю, что мне нужно очистить ввод пользователя, чтобы предотвратить выполнение произвольных команд... Есть ли еще какие-нибудь вещи для проверки?

Спасибо заранее.

Ответ 1

Будьте осторожны, чтобы избежать любых входящих данных, которые вы можете ввести в команду, используя escapeshellarg().

Использование абсолютных путей к исполняемому элементу по вашему выбору минимизирует риск того, что PHP script вызывает неправильный файл.

Кроме этого, я не вижу, о чем суету в некоторых других ответах - в конце концов, вы не говорите о том, чтобы позволить пользователям выполнять произвольные команды. (Исправьте меня, если я ошибаюсь.) В целом, выполнение внешних команд из PHP - это прекрасная практика безопасности IMO.

Вам нужно иметь в виду, что программа, которую вы вызываете, работает с правами пользователя PHP, и ей не разрешается делать все, но я предполагаю, что вы уже это знаете.

Ответ 2

Вы должны следить за этими вещами:

  • Нефиксированные команды, это означает, что вы должны предоставить команду, пользовательский ввод должен быть только параметрами, если вообще.
  • Параметры, которые обманывают команду для выполнения других команд. Для этого вероятным кандидатом является имя с запятой +.
  • Символы Escape, которые обманут exec в выполнении других команд.
  • Загруженный пользователем контент, который заставит команду выполнять другие команды, либо напрямую (через какой-либо шаблон, включить или связать механизм), либо косвенно через дыры безопасности (утечки памяти, переполнение стека и т.д.) в вызываемой команде.
  • Относительные пути в параметрах. Всегда пытайтесь преобразовать их в абсолютные пути и сравнить со списком разрешенных путей.

Механизмы защиты от эксплойтов:

  • Строгий белый список команд, параметров и имен файлов/путей.
  • Выполнение команды как конкретного пользователя с очень небольшим количеством привилегий.
  • Песочница для команды в тюрьме chroot.

Ответ 3

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

Имейте в виду, что вы выполняете эти программы с вашими привилегиями, поэтому, если они каким-то образом изменены, ваша учетная запись может быть скомпрометирована.

Ответ 4

Как насчет того, чтобы не очищать пользовательские входы, чтобы они могли выполнять любую команду, которая им нравится... например, формат; -)

Ответ 5

Самая большая проблема заключается в том, что вы сможете выполнить практически любую системную команду. Поэтому, как минимум, вам необходимо убедиться, что любой ввод, предоставленный пользователем и используемый в команде exec, правильно экранирован и проверен.

В этой статье есть хорошее объяснение:

http://onlamp.com/pub/a/php/2003/08/28/php_foundations.html

Ответ 6

Подтверждение ввода крайне занижено для exec. Существует так много возможностей злоупотреблять такими командами, которые вы не можете себе представить (базовый пример: имеете ли вы хотя бы о фильтрации труб и перенаправлений?).

Я бы предложил запустить команды в exec в некоторых защищенных песочницах, чтобы ваша ОС не была видна. Однако имейте в виду, что это очень сложно, так как PHP будет работать в вашей ОС.

Ответ 7

Я бы настоятельно предложил убежать. Сбрасывание ненадежных данных в командной строке немного рискованно. Гораздо лучше запустить внешнюю программу с фиксированными аргументами и передать ей данные. Вам также может потребоваться больше разрешений для интерпретатора PHP, чем вы хотели бы или сделать программу whatsit-bit set, ни одна из которых особенно не понравилась мне.