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 Shell Offender? В основном он использовал функцию eval для эксплойта. Хакеры могут запускать свой PHP-код на вашем сайте.

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

Так вот сценарий. Ищите полезные ответы / решения.

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

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

Но, как говорится в документации:

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

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

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

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

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

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

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

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

-Любые каталоги, которые обслуживают только носители, должны отключить весь доступ к сценарию, а все загрузки и носители должны размещаться только в таком каталоге. Лучше использовать белый список только приемлемых носителей, а не черных списков, так как существует несколько способов выполнения файла сценария (например: php , php5 , phtml и т. Д.), 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», чтобы усердно работать с вашей системой максимально безопасно или несовместимо, создавать массивные уязвимости и изобретать любое количество обходных халатов, чтобы сделать так, чтобы на самом деле сложнее, чем просто сделать это правильно.

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

Короче: вы не можете этого сделать.

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

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

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

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

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

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

Вы можете отключить eval через https://github.com/mk-j/PHP_diseval_extension и обойти проблему suhosin, не совместимую с php7 / стабильную.