Безопасность выполнения команды из php - PullRequest
0 голосов
/ 04 мая 2010

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

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

РЕДАКТИРОВАТЬ: я знаю, что я должен очистить ввод пользователя, чтобы предотвратить выполнение произвольных команд ... Есть ли другие вещи, чтобы проверить?

Заранее спасибо.

Ответы [ 7 ]

3 голосов
/ 04 мая 2010

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

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

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

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

2 голосов
/ 04 мая 2010

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

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

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

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

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

0 голосов
/ 04 мая 2010

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

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

0 голосов
/ 04 мая 2010

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

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

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

0 голосов
/ 04 мая 2010

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

0 голосов
/ 04 мая 2010

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

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

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