Назад | Перейти на главную страницу

Проблемы безопасности запуска команды с помощью PHP-скрипта

Я хочу запустить программу командной строки с PHP-скриптом. Каковы проблемы безопасности при использовании этого на VPS?

Я много слышал, что это небезопасно. Но хотите знать, как именно? Кроме того, тогда как лучше всего будет выполнить команду.

РЕДАКТИРОВАТЬ: Я хочу запустить cutycapt (инструмент для создания снимков экрана) вместе с xvfb-run (виртуальное окно). Так что потребуются привилегии.

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

  1. Скрипт, который запускается ls /tmp и отображает вывод
    Наверное, это нормально. У вас может быть утечка информации (кто-то, попав на страницу, знает, что содержимое /tmp на сервере, что может дать им идеи о том, как обойти вашу безопасность).

  2. Скрипт, который greps для указанной пользователем строки в файле
    Это наверное НЕ нормально: сценарий вызовет что-то вроде system("grep $user_string /some/file"), а изобретательный злоумышленник сможет понять, что он делает, вставив дополнительный ; в $user_string bit, а затем запустить произвольный код от имени пользователя веб-сервера.

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

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

Я бы посоветовал написать сценарий оболочки, который включает в себя все команды, которые необходимо запустить. Таким образом, PHP не будет запускать команду напрямую, а будет использовать сценарий оболочки для выполнения того, что требуется. Кроме того, вы можете использовать sudo и редактировать sudoers по мере необходимости, чтобы помочь вам запускать команды, требующие более высоких привилегий.

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

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