Я пишу веб-приложение, в котором я использую несколько сторонних команд, вызывающих их с помощью функции exec
в PHP (например, я делаю формулы Latex с помощью командной строки).
Мой вопрос: каковы проблемы безопасности при выполнении внешних программ командной строки в php? О чем я должен знать? Можете ли вы дать мне список очков для проверки?
EDIT: Я знаю, что я должен очистить пользовательский ввод, чтобы предотвратить выполнение произвольных команд … Есть ли еще какие-нибудь вещи для проверки?
Заранее спасибо.
Будьте осторожны, чтобы избежать любых входящих данных, которые вы можете ввести в команду, используя escapeshellarg () .
Использование абсолютных путей к исполняемому элементу по вашему выбору минимизирует риск того, что PHP-скрипт вызовет неправильный файл.
Кроме этого, я не вижу, о чем суету в некоторых других ответах – в конце концов, вы не говорите о том, чтобы позволить пользователям выполнять произвольные команды. (Исправьте меня, если я ошибаюсь.) В целом, выполнение внешних команд из PHP – это прекрасная практика безопасности IMO.
Вам нужно иметь в виду, что программа, которую вы вызываете, работает с правами пользователя PHP, и ей не разрешается делать все, но я полагаю, вы уже знаете это.
Вы должны следить за этими вещами:
Механизмы безопасности против эксплойтов:
Если другим людям разрешено устанавливать программы в базовый путь, вы можете обнаружить, что не выполняете то, что ожидаете.
Имейте в виду, что вы выполняете эти программы с вашими привилегиями, поэтому, если они каким-то образом изменены, ваша учетная запись может быть скомпрометирована.
Как насчет того, чтобы не очищать свои пользовательские входы, чтобы они могли выполнять любую команду, которая им нравится … например, формат 😉
Самая большая проблема заключается в том, что вы сможете выполнить практически любую системную команду. Поэтому, как минимум, вам необходимо убедиться, что любой ввод, предоставленный пользователем и используемый в команде exec, правильно экранирован и проверен.
эта статья имеет хорошее объяснение:
Подтверждение ввода крайне недооценивается для exec. Существует так много возможностей злоупотреблять такими командами, которые вы не можете себе представить (базовый пример: имеете ли вы хотя бы о фильтрации труб и перенаправлений?).
Я бы предложил запустить команды в exec в некоторых защищенных песочницах, чтобы ваша ОС не была видна. Однако имейте в виду, что это очень сложно, так как PHP будет работать в вашей ОС.
Я бы настоятельно предложил убежать. Сбрасывание ненадежных данных в командной строке немного рискованно. Гораздо лучше запустить внешнюю программу с фиксированными аргументами и передать ей данные. Вам также может потребоваться больше разрешений для интерпретатора PHP, чем вы хотели бы или сделать программу whatsit-bit set, ни одна из которых особенно не понравилась мне.