Intereting Posts
PHP Memcache подключается к couchbase, но не может ничего сделать при включении () или require () мне всегда нужно использовать ../../ относительно моего файла? Есть простой способ? Отображение сообщения, когда набор результатов пуст Устранение неполадок «Неожиданный T_ECHO» в операторной инструкции оператора Как протестировать загрузку файлов в Laravel 5.2 apc_store не работает между запросами Magento: Как проверить, зарегистрирован ли администратор в контроллере модуля? strlen () и UTF-8 Методы мгновенного обмена мгновенными сообщениями PHP Невозможно разобрать XML-данные с двоеточием (:) из ответа с помощью getNamespaces () Конкатенация строки PHP с помощью «,»? Водяной знак на анимированном gif с php Сплошное значение Sprintf PHP Сортировка многомерного массива по элементу, содержащему дату Каковы методы работы с точки зрения «Жирная модель, тощий контроллер» с Laravel Racquent ORM?

Безопасность выполнения команды из php

Я пишу веб-приложение, в котором я использую несколько сторонних команд, вызывающих их с помощью функции exec в PHP (например, я делаю формулы Latex с помощью командной строки).

Мой вопрос: каковы проблемы безопасности при выполнении внешних программ командной строки в php? О чем я должен знать? Можете ли вы дать мне список очков для проверки?

EDIT: Я знаю, что я должен очистить пользовательский ввод, чтобы предотвратить выполнение произвольных команд … Есть ли еще какие-нибудь вещи для проверки?

Заранее спасибо.

Solutions Collecting From Web of "Безопасность выполнения команды из php"

Будьте осторожны, чтобы избежать любых входящих данных, которые вы можете ввести в команду, используя escapeshellarg () .

Использование абсолютных путей к исполняемому элементу по вашему выбору минимизирует риск того, что PHP-скрипт вызовет неправильный файл.

Кроме этого, я не вижу, о чем суету в некоторых других ответах – в конце концов, вы не говорите о том, чтобы позволить пользователям выполнять произвольные команды. (Исправьте меня, если я ошибаюсь.) В целом, выполнение внешних команд из PHP – это прекрасная практика безопасности IMO.

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

Вы должны следить за этими вещами:

  • Нефиксированные команды, что означает, что вы должны предоставить команду, пользовательский ввод должен быть только параметрами, если вообще.
  • Параметры, которые обманывают команду для выполнения других команд. Для этого вероятным кандидатом является имя с запятой +.
  • Escape chars, который обманет exec в выполнении других команд.
  • Загруженный пользователем контент, который заставит команду выполнять другие команды, либо напрямую (через какой-либо шаблон, включить или связать механизм), либо косвенно через отверстия безопасности (утечки памяти, переполнение стека и т. Д.) В вызываемой команде.
  • Относительные пути в параметрах. Всегда старайтесь преобразовать их в абсолютные пути и сравнить со списком разрешенных путей.

Механизмы безопасности против эксплойтов:

  • Строгий белый список команд, параметров и имен файлов / путей.
  • Выполнение команды как конкретного пользователя с очень небольшим количеством привилегий.
  • Песочница команды в тюрьме chroot.

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

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

Как насчет того, чтобы не очищать свои пользовательские входы, чтобы они могли выполнять любую команду, которая им нравится … например, формат 😉

Самая большая проблема заключается в том, что вы сможете выполнить практически любую системную команду. Поэтому, как минимум, вам необходимо убедиться, что любой ввод, предоставленный пользователем и используемый в команде exec, правильно экранирован и проверен.

эта статья имеет хорошее объяснение:

http://onlamp.com/pub/a/php/2003/08/28/php_foundations.html

Подтверждение ввода крайне недооценивается для exec. Существует так много возможностей злоупотреблять такими командами, которые вы не можете себе представить (базовый пример: имеете ли вы хотя бы о фильтрации труб и перенаправлений?).

Я бы предложил запустить команды в exec в некоторых защищенных песочницах, чтобы ваша ОС не была видна. Однако имейте в виду, что это очень сложно, так как PHP будет работать в вашей ОС.

Я бы настоятельно предложил убежать. Сбрасывание ненадежных данных в командной строке немного рискованно. Гораздо лучше запустить внешнюю программу с фиксированными аргументами и передать ей данные. Вам также может потребоваться больше разрешений для интерпретатора PHP, чем вы хотели бы или сделать программу whatsit-bit set, ни одна из которых особенно не понравилась мне.