Подтвердить что ты не робот

PHP: как отключить опасные функции

Как отключить опасную функцию eval? Можно ли это сделать с помощью функции ini_set?

Также как отключить следующие функции? Можем ли мы отключить их с помощью функции ini_set?

allow_url_fopen  
allow_url_include
exec
shell_exec
system
passthru
popen
stream_select

eval - одна из самых опасных функций, которую плохие парни могут использовать для использования вещей. Должен быть механизм, чтобы отключить это, не прибегая к файлу php.ini; но это должно быть сделано программно.

Ну, ребята, я ищу ответы, предлагающие отключить этих опасных симпатичных парней, не перейдя в файл php.ini; Я имею в виду, как отключить их во время выполнения или программно?

Спасибо заранее....

Обновление

Кто-нибудь слышал о нарушителе оболочки PHP Script? В основном он использовал функцию eval для эксплойта. Хакеры могут запускать свой PHP-код на вашем сайте.

Мой вопрос состоял в том, что я не хочу вообще отключать функцию eval из файла php.ini. Например, я разработал свою собственную структуру MVC. Теперь пользователи инфраструктуры могут указать из файла конфигурации frameworks, должна ли функция eval (и др.) Быть отключена или нет. Таким образом, это остается для выбора пользователей инфраструктуры. Как только они укажут, чтобы отключить его; я должен иметь возможность автоматически отключать функцию eval.

Итак, это сценарий. Поиск полезных ответов/решений.

Еще раз спасибо.

4b9b3361

Ответ 1

Чтобы отключить функции, главным образом по соображениям безопасности, вы можете использовать директиву disable_functions в конфигурационном файле php.ini.

Но, как указано в документации:

Эта директива должна быть установлена ​​в php.ini Например, вы не можете установить это в httpd.conf.

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


Тем не менее, лучшей мерой безопасности является запись чистого/защищенного кода, фильтрация всех входных данных, выход всех выходных данных... И не позволяйте кому-либо запускать собственный код на вашем сервере!

Ответ 2

Боюсь, что вы сильно застряли, используя php.ini, чтобы отключить большинство из них. Однако ухудшается. eval() технически не является функцией, это языковая конструкция, поэтому она НЕ МОЖЕТ быть отключена с помощью disable_functions. Для этого вам нужно будет установить что-то вроде Suhosin и отключить его оттуда.

Хороший веб-мастер должен рассмотреть обзор безопасности как неотъемлемую часть настройки сайта. Не пытайтесь полностью отвлечь это, люди уже достаточно ленивы о безопасности. Если вы собираетесь использовать инструменты (например, веб-хост), вы должны взять на себя инициативу, чтобы иметь хотя бы беглые знания о том, как управлять одним ответственно.

Тем не менее, есть некоторые другие вещи, которые вы можете сделать, чтобы серьезно подорвать большинство попыток взлома, в том числе:

-Disable base64_decode() с помощью disable_functions. Теперь есть способы обойти это, однако подавляющее большинство сценариев взлома являются родовыми по своей природе, и это сломает около 95% из них, поскольку они требуют существования ОБА этих функций для правильной работы. Это не означает, что ваш сервер не может быть взломан, но в большинстве случаев он будет нести накладные расходы при ручном обнюхивании вашего сервера на наличие уязвимостей, и большинство хакеров играют цифры и не получают на это времени (ПРИМЕЧАНИЕ: у некоторых хакеров есть время для этого, это не волшебная пуля сама по себе).

-Filter все входные данные для обычных шаблонов строк эксплойта типа <?php, которые часто используются для скрипирования открытым тегом php незаметно. Существует несколько таких шаблонов. Лучшая практика заключается в белом списке конкретных символов и отвергать все остальные на основе ввода. По крайней мере, фильтруйте вышеупомянутые нулевые терминаторы и возможные строки ввода sql, такие как '; -- (не предполагайте, что просто использование pdo или mysqli будет фильтровать ВСЕ попытки инъекций, есть еще некоторые способы вывести это из если вы правильно используете подготовленные заявления).

-Любые каталоги, которые обслуживают только носители, должны иметь все script доступ отключен, и все загрузки и носители должны размещаться только в таком каталоге. Лучше использовать белый список только для приемлемых медиа, а не для черных списков, так как существует несколько способов выполнения файла script (например: php, php5, phtml и т.д.), Которые индивидуально могут или могут не доступны в любой серверной среде. Вы можете сделать это с помощью простого .htaccess, помещенного в медиа-каталог, подобный этому:

php_flag engine off
AddHandler cgi-script .php .php3 .php4 .phtml .pl .py .jsp .asp .aspx .htm .html .shtml .sh .cgi
Options -Indexes -ExecCGI

<Files "\.(jpe?g|png|gif|bmp|tiff|swf|flv|mov|avi|mp4)$">
  order deny,allow
  deny from all
</Files>

Эта часть может быть динамически написана php, поэтому ваше приложение будет способно обеспечить конфиденциальность каталогов подобным образом, что может снизить значительную часть хакерской боли, поскольку это обычно игнорируется. Обычно я добавляю аналогичный .htaccess почти на каждый сайт Wordpress, над которым я работаю в каталоге uploads, и часто задавался вопросом, почему это не делается из коробки, поскольку он блокирует множество попыток взлома и не мешает приложению в любом случае, что я заметил.

К сожалению, если вы не на сервере Apache, вам нужно будет найти другое решение (в IIS есть скорее всего эквивалент, но я не знаю, что это было бы лично).

-Вы также должны настроить свой .htaccess(или web.config/etc), чтобы отключить любые методы доступа, которые не нужны для вашего конкретного приложения. Если вы не используете веб-службы RESTful, нет причин разрешать PUT или DELETE, вы наверняка должны также отключить TRACE, и, вероятно, также не имеете повода оставлять OPTIONS или HEAD включен. Следует также упомянуть, что все непризнанные методы подключения по умолчанию разрешают GET, что означает, что из командной строки я могу сделать что-то вроде:

curl -X BOOGITY -d arg=badstuff -d arg2=morebadstuff yoursite.com

В этом примере BOOGITY не имеет смысла, однако ваш сервер будет интерпретировать это как:

curl -X GET -d arg=badstuff -d arg2=morebadstuff yoursite.com

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

В большинстве случаев основной задачей является не выполнение трудностей с выполнением определенных шаблонов php в вашей среде, поэтому необходимо предотвратить включение кода изгоев (локально или извне), чтобы он не стал проблемой. Если вы разрешаете установку модулей или таковых в вашу CMS, неаккуратные программисты в конечном итоге создадут эксплойты, о которых вы не можете действительно многое сделать, помимо применения довольно строгих параметров API, из-за которых очень сложно сделать это плохо, но это никогда не может быть сделал невозможным. Никогда не недооценивайте возможности оффшорного хакерского магазина или самопровозглашенного "php ninja", чтобы усердно работать с вашей системой максимально безопасно или несовместимо, создавать массивные уязвимости и изобретать любое количество обходных халатов, чтобы сделать так, чтобы на самом деле сложнее снять, чем просто сделать правильный путь.

/запрос безопасности.

Ответ 3

Вкратце: вы не можете этого сделать.

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

Обозреватель php shell script, о котором вы упомянули, представляет собой простой PHP скрипт, передающий аргументы этим функциям. Но у злоумышленников уже был способ инъекции/загрузки вредоносного script. Если вы вообще не используете эти функции и не передаете аргументы от ввода пользователем, злоумышленники не могут запускать произвольный код на вашем сервере с помощью eval() или родственников.

Собираетесь ли вы разместить эту инфраструктуру для своих пользователей? Если вы разрешаете пользователям загружать и запускать код, тогда у вас есть большая проблема в ваших руках.

Читайте о выполнении удаленного кода и включении удаленного/локального файла здесь, чтобы узнать больше об атаках, связанных с этим: Общие уязвимости PHP

Ответ 4

Директива disable_functions доступна только в конфигурации php.ini.

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