Безопасно ли использовать PHP exec () для обработки системных задач на сервере? - PullRequest
2 голосов
/ 30 сентября 2011

Я занимаюсь разработкой приложения на PHP и Javascript, и мне нужно настроить дисковые квоты для данного пользователя (поскольку я использую демон FTP (в данном случае ProFTPd), чтобы пользователи могли иметь собственный менеджер документов ) поэтому elFinder (менеджер документов, который я сейчас думаю об использовании) может запускаться «свободно» (вместо того, чтобы создавать собственную PHP-функцию для контроля того, сколько места фактически используется).

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

Ответы [ 3 ]

3 голосов
/ 30 сентября 2011

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

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

У меня еще есть несколько предложений для вас:

  1. убедитесь, что ваш скрипт не принимает входные данные извне, он не читает базу данных или файл. Все должно быть заключено в сценарий.

  2. Попробуйте поместить скрипт где-нибудь за пределами documentRoot, чтобы он не был доступен пользователям.

  3. Установите некоторые специальные разрешения для скрипта, чтобы его действия ограничивались пользователем, от которого он запускается. Даже если кто-то что-то сломает, ОС не позволит ему сделать что-то еще, кроме выполнения этой конкретной команды в определенной среде.

Это, конечно, может быть дополнено дополнительными правилами, но это только то, что приходит на ум сейчас. Надеюсь, это поможет

2 голосов
/ 30 сентября 2011

Небезопасно, если вы разрешаете пользователю вводить информацию;POST или GET значения без фильтрации.

Если вам нужно использовать значение GET, введенное пользователем, вы должны использовать escapeshellarg() или escapeshellcmd().

0 голосов
/ 30 сентября 2011

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

...