%20%D0%B1%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D1%8B%D0%B9%20%D1%81%D0%BF%D0%BE%D1%81%D0%BE%D0%B1%20%D0%B7%D0%B0%D0%BF%D1%83%D1%81%D0%BA%D0%B0%20%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%20CLI%20%D0%B8%D0%B7%20%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82%D0%B0%3F.png)
С тех пор, как я начал программировать приложения LAMP, я хотел разработать панель управления администратора для своих коробок. (В развлекательных и образовательных целях, в противном случае я бы использовал что-то уже существующее на рынке)
Но меня всегда останавливало то, что я всегда слышал, что функции exec() (единственный известный мне способ добиться этого) — это зло... знаете: «не используйте их», «это плохой код» и т. д.
Я никогда не слышал о более безопасной альтернативе для этой цели, поэтому мой вопрос:
Есть ли?
Разве недостаточно запустить это приложение на выделенном веб-сервере с защищенным паролем корневым каталогом документов?
Ну, в этом я сомневаюсь.
решение1
Я думаю, что реальный риск возникает, когда вы смешиваете вводимые пользователем данные с одним из этих exec()
. Именно здесь возникает большая часть риска, поскольку вы позволяете пользователям вводить вам данные, которые при смешивании с CLI могут делать опасные вещи, например, вставлять точки с запятой ( ;
) в текстовое поле и выполнять дополнительные команды после того, как они предоставили аргументы.
Таким образом, в целом запуск команд в режиме «только для чтения» не должен быть более опасным, чем выполнение чего-либо другого.
По сути, это та же проблема, что и при атаке с использованием SQL-инъекции, с которой вы, возможно, более знакомы.
решение2
Насколько мне известно (а я не программист, так что воспринимайте это с долей скепсиса), exec()
вызовы вовсе не являются злом. Просто они создают новый процесс и имеют высокие накладные расходы, поскольку вы вызываете системную функцию. Обычно люди предлагают вам делать что-то внутри любой программы/скрипта, который вы пишете, и избегать внешних вызовов, таких как exec()
.
Однако если ваша цель — выполнить команды в системе, то без такого вызова это сделать невозможно. Конечно, существуют риски безопасности, позволяя случайным пользователям выполнять произвольные команды на вашем сервере, вы навлекаете неприятности. Однако если доступ к этому серверу строго ограничен, вы должны иметь возможность сделать это безопасно.
В любом случае, главный вывод: exec()
функции не являются изначально плохими, они просто, как правило, менее эффективны, чем выполнение чего-либо внутри.