Существует ли (относительно) безопасный способ запуска команд CLI из Интернета?

Существует ли (относительно) безопасный способ запуска команд CLI из Интернета?

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

Но меня всегда останавливало то, что я всегда слышал, что функции exec() (единственный известный мне способ добиться этого) — это зло... знаете: «не используйте их», «это плохой код» и т. д.

Я никогда не слышал о более безопасной альтернативе для этой цели, поэтому мой вопрос:

Есть ли?

Разве недостаточно запустить это приложение на выделенном веб-сервере с защищенным паролем корневым каталогом документов?

Ну, в этом я сомневаюсь.

решение1

Я думаю, что реальный риск возникает, когда вы смешиваете вводимые пользователем данные с одним из этих exec(). Именно здесь возникает большая часть риска, поскольку вы позволяете пользователям вводить вам данные, которые при смешивании с CLI могут делать опасные вещи, например, вставлять точки с запятой ( ;) в текстовое поле и выполнять дополнительные команды после того, как они предоставили аргументы.

Таким образом, в целом запуск команд в режиме «только для чтения» не должен быть более опасным, чем выполнение чего-либо другого.

По сути, это та же проблема, что и при атаке с использованием SQL-инъекции, с которой вы, возможно, более знакомы.

решение2

Насколько мне известно (а я не программист, так что воспринимайте это с долей скепсиса), exec()вызовы вовсе не являются злом. Просто они создают новый процесс и имеют высокие накладные расходы, поскольку вы вызываете системную функцию. Обычно люди предлагают вам делать что-то внутри любой программы/скрипта, который вы пишете, и избегать внешних вызовов, таких как exec().

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

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

Связанный контент