disable functions php ini

PHP.INI settings Disable exec, shell_exec, system, popen and Other Functions To Improve Security

I run a small Apache based web-server for my personal use, and it is shared with friends and family. However, most script kiddie try to exploit php application such as WordPress using exec(), passthru(), shell_exec(), system() functions. How do I disable these functions to improve my php script security?

Tutorial details
Difficulty level Easy
Root privileges Yes
Requirements LAMP
Est. reading time 5m

PHP has a lot of functions which can be used to crack your server if not used properly. You can set list of functions in php.ini using disable_functions directive. This directive allows you to disable certain functions for security reasons. It takes on a comma-delimited list of function names. disable_functions is not affected by Safe Mode.

PHP.INI settings Disable exec, shell_exec, system, popen and Other Functions To Improve Security

Open a terminal application or login to your server over the ssh session using ssh command. Open php.ini file using a text editor such as vim command or nano command:
$ sudo vi /etc/php.ini
OR
$ sudo nano /etc/php.ini
Find disable_functions and set new list as follows:

I also recommend to disable allow_url_include and allow_url_fopen for security reasons:

Save and close the file. Restart the httpd server by tying the following command:
# service httpd restart
OR if you are using Debian/Ubuntu Linux, run:
# service apache2 restart

A note about systemd based system

If you are using systemd + RHEL/CentOS/Fedora Linux based system, enter:
# systemctl httpd restart
If you are using systemd + Debian/Ubuntu Linux based system, enter:
# systemctl restart apache2

A note about PHP-fpm under a Debian/Ubuntu/CentOS Linux

Create a file named security.ini /etc/php/7.0/fpm/conf.d/ directory:
$ vi sudo /etc/php/7.0/fpm/conf.d/99-security.ini
Append the following settings:

Save and close the file when using a vim text editor. Next you need to restart the php-fpm/php7.0-fpm/php5.0-fpm service service, run:
$ sudo systemctl restart php-fpm # &lt- CentOS/RHEL 7.x
$ sudo systemctl restart php7.0-fpm.service # &lt- Ubuntu/Debian

See also:

🐧 Get the latest tutorials on Linux, Open Source & DevOps via

Comments on this entry are closed.

This is not enought because you can always use “`” that will bypass these limitation.

That’s not true: When shell_exec() has been disabled, the backticks are unavailable as well.
See http://php.net/manual/en/language.operators.execution.php:
“Note: The backtick operator is disabled when safe mode is enabled or shell_exec() is disabled.”

Sorry, I overlooked the comment by “Experts” that was not filed as a reply to Davide.

I guess if you really need those functions, you can overwrite the configuration using ini_set function in your script to enable them for a particular site.

I can’t understand if they can be re-enabled in scripts why should we disable them? hackers may use ini_set() to enable them! Or is there any restrictions/limits for hackers while calling ini_set() that I don’t know?

Davide you are wrong “`” using shell_exec function so if we disable shell_exec then “`” will be disabled too

Why is “parse_ini_file” disabled?

show_source is an alias of highlight_file.
Why would you disable this function?
You can read the contents of a file with readfile() or file_get_contents :/

readfile() and file_get_contents() functions are subject to the open_basedir restriction.
Obviously you should set the open_basedir php setting to your docroot, so the scripts won’t be able to read files above docroot in your file system!

if i create a custom php.ini file, it would overwrite disable_functions directive, so this is useless.
how can you overcome that.

“ubuntu lover”: Either you want to disable those functions or not. If you want you have to change php.ini: overwrite disable_functions and set a new list or modify the existing one. I’m not sure you think it makes it useless. Only the server admin can do that and he will only disable the functions he wants, editing that list.
Also Eric says: “if you really need those functions, you can overwrite the configuration using ini_set function in your script to enable them for a particular site.” But again you can do that only on the server side.

this functions easily bypassed with cgi telnet perl script!

So what’s the solution? To disable telnet?

if telnet is enabled.. you need to re-assess your system security

it didnot work for me

Helo, sorry my english is not so good. My Question: How can I enable exec on Linux? Thanks for the Answers 🙂 Bye

Here is the list i use. Most script dont use any of these functions anyway (except for chmod maybe, for file management script or something).

exec, passthru, shell_exec, system, proc_open, posix_mkfifo, pg_lo_import, dbmopen, dbase_open, popen, chgrp, chown, chmod, symlink, pcntl_exec,
apache_child_terminate, apache_setenv, define_syslog_variables, posix_getpwuid, posix_kill, posix_mkfifo, posix_setpgid, posix_setsid, posix_setuid,
posix_setuid, posix_uname, proc_close, pclose, proc_nice, proc_terminate, shell_exec

imo you should look limitations in wordpress not in php. It’s program not language unsafe.

Best one I could found is this :

#Protect your website from Hacking using this php.ini By Mauritania Attacker

give me errors
Warning: mysql_connect(): No such file or directory in /opt/lampp/htdocs/hellophp/index.php on line 2
No such file or directory

this works fine on my windows but not on linux although all configuration of lampp is fine..help

mysql_connect(“localhost:3306″,”root”,”sach”) or die(mysql_error());
mysql_select_db(“sample”) or die(mysql_error());

i have tried removing 3306 still not working
same problem
Warning: mysql_connect(): No such file or directory in /opt/lampp/htdocs/hellophp/index.php on line 2

This article is laughable at best. Sure, the functions mentioned can be used to exploit security issues, but if your server is properly configured, you shouldn’t need to do so.

exec, passthru, shell_exec, system, proc_open and popen are all dependent on server permissions. If your server is configured properly, the user accounts should not be able to do anything dangerous with these.

curl_exec and curl_multi_exec are both quite useful. I don’t see how these can be dangerous.

parse_ini_file and show_source are both completely harmless. I highly recommend you read up on what these do before you go blindly recommending people disable them.

Источник

Disable functions php ini

Представленные здесь значения по умолчанию используются в случае, если не был подключён php.ini ; значения для боевого php.ini и для разработки могут различаться.

Языковые опции

Опции языка и прочих настроек

Имя По умолчанию Место изменения Список изменений
short_open_tag «1» PHP_INI_PERDIR
precision «14» PHP_INI_ALL
serialize_precision «-1» PHP_INI_ALL До версии PHP 7.1.0 значение по умолчанию было равно 17.
disable_functions «» Только PHP_INI_SYSTEM
disable_classes «» Только php.ini
exit_on_timeout «» PHP_INI_ALL
expose_php «1» Только php.ini
hard_timeout «2» PHP_INI_SYSTEM Доступна с версии PHP 7.1.0.
zend.exception_ignore_args «0» PHP_INI_ALL Доступна с версии PHP 7.4.0
zend.multibyte «0» PHP_INI_ALL
zend.script_encoding NULL PHP_INI_ALL
zend.detect_unicode NULL PHP_INI_ALL
zend.signal_check «0» PHP_INI_SYSTEM
zend.assertions «1» PHP_INI_ALL с ограничениями

Краткое разъяснение конфигурационных директив.

Выдаёт факт присутствия PHP на сервере, включая передачу версии PHP в HTTP-заголовке (например, X-Powered-By: PHP/5.3.7).

Эта директива позволяет отключить некоторые функции. Она принимает список имён функций, разделённый запятыми.

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

Если процесс стартован в режиме релиза, zend.assertions не может быть изменён во время выполнения, так как код утверждений не генерируется.

Когда истечёт время ожидания, установленное в max_execution_time, среда выполнения PHP аккуратно отключит ресурсы. Если во время этого что-то застрянет, время ожидания будет установлено на указанное количество секунд. Когда истечёт жёсткое время ожидания, PHP завершит работу с ошибкой. Если установлено значение 0, жёсткое время ожидания никогда не активируется.

Когда PHP останавливается после жёсткого времени ожидания, это будет выглядеть примерно так:

Исключает аргументы из трассировки стека, сгенерированных из исключений.

Разрешает парсинг исходных файлов в многобайтных кодировках. Включение zend.multibyte требуется для использования кодировок символов подобных SJIS, BIG5 и т.д., содержащих специальные символы в многобайтных строковых данных. Совместимые с ISO-8859-1 кодировки, например UTF-8, EUC и т.д., не требуют эту опцию.

Модуль zend.multibyte требует установленного модуля «mbstring».

Данное значение будет использовано, только при отсутствии директивы declare(encoding=. ) в начале скрипта. При использовании кодировок несовместимых с ISO-8859-1, нужно использовать опции и zend.multibyte и zend.script_encoding.

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

Эта директива только для Apache1 mod_php, которая заставляет потомка Apache завершиться, если произошёл тайм-аут исполнения скрипта PHP. Такой тайм-аут приводит к внутреннему вызову longjmp() в Apache1, который оставляет некоторые модули в несогласованном состоянии. По завершении процесса все неснятые блокировки или память будут очищены.

Ограничения ресурсов

Ограничения ресурсов

Имя По умолчанию Место изменения Список изменений
memory_limit «128M» PHP_INI_ALL

Краткое разъяснение конфигурационных директив.

Настройка производительности

Настройка производительности

Имя По умолчанию Место изменения Список изменений
realpath_cache_size «4M» PHP_INI_SYSTEM До PHP 7.0.16 и 7.1.2, по умолчанию было «16K»
realpath_cache_ttl «120» PHP_INI_SYSTEM

Использование open_basedir отключит кеш realpath.

Краткое разъяснение конфигурационных директив.

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

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

Размер, необходимый для кеширования, зависит от системы.

Время (в секундах) в течение которого будет использован кеш realpath для указанного файла или директории. Для систем с редко меняющимися файлами это значение можно увеличить.

Обработка данных

Конфигурационные опции обработки данных

Имя По умолчанию Место изменения Список изменений
arg_separator.output «&» PHP_INI_ALL
arg_separator.input «&» PHP_INI_PERDIR
variables_order «EGPCS» PHP_INI_PERDIR
request_order «» PHP_INI_PERDIR
auto_globals_jit «1» PHP_INI_PERDIR
register_argc_argv «1» PHP_INI_PERDIR
enable_post_data_reading «1» PHP_INI_PERDIR
post_max_size «8M» PHP_INI_PERDIR
auto_prepend_file NULL PHP_INI_PERDIR
auto_append_file NULL PHP_INI_PERDIR
default_mimetype «text/html» PHP_INI_ALL
default_charset «UTF-8» PHP_INI_ALL
input_encoding «» PHP_INI_ALL
output_encoding «» PHP_INI_ALL
internal_encoding «» PHP_INI_ALL

Краткое разъяснение конфигурационных директив.

Этот разделитель используется в генерируемых PHP URL в качестве разделителя аргументов.

Список разделителей, используемых PHP для получения переменных из URL.

Каждый символ в этой директиве считается разделителем!

Эта директива регулирует порядок, в котором PHP добавляет переменные GET, POST и Cookie в массив _REQUEST. Добавление производится слева направо, новые значения перезаписывают старые.

Когда включено, переменные SERVER, REQUEST и ENV создаются в тот момент, когда они впервые используются (Just In Time), а не в начале выполнения скрипта. Если эти переменные в скрипте не используются, включение этой директивы приведёт к росту производительности.

Использование переменных SERVER, REQUEST и ENV проверяется на стадии компиляции, поэтому их использование с помощью, например, переменных переменных не запустит их инициализацию.

Источник

PHP: How To Disable Dangerous Functions

How can I disable the dangerous eval function? Can that be done using ini_set function?

Also how to disable following functions? Can we disable them using ini_set function?

eval is one of the most dangerous function that bad guys can use to exploit the things. There should be a mechanism to disable that without resorting to php.ini file; but is should be done programatically.

Well, guys I am looking for an answers suggesting disabling of these dangerous lovely fellows without going to php.ini file; I mean how to disable them at runtime or programatically?

Update

Has anyone heard about PHP Shell Offender Script? It mainly used the eval function for the exploit. Hackers are able to run their PHP code on your site.

My question was that I don’t want to disable the eval function from php.ini file altogether. For example, i have developed my own MVC framework. Now the framework users can specify from frameworks config file whether eval (and others) function should be disabled or not. So this is left to the choice of framework users. Once they specify to disable it; i should be able to disable the eval function programatically.

So that is the scenario. Looking for helpful answers/solutions.

6 Answers 6

A good webmaster should consider a security review to be an essential part of site setup. Do not try to completely abstract this away, people are lazy enough about security already. If you are going to use tools (like a webhost), you should take the initiative to have at least a cursory knowledge of how to manage one responsibly.

That said, there are some other things you can do to severely cripple most hack attempts, including:

Unfortunately, if you are not on an apache server, you will need to find another solution (on IIS there is most likely an equivalent, but I am not aware of what it would be personally).

In this example, BOOGITY is meaningless, however, your server will interpret this as:

In most cases, the primary point is not to make it difficult to execute specific php patterns in your environment, the point is to prevent the inclusion of rogue code (either locally or externally) so it does not become an issue. If you are allowing the installation of modules or such into your CMS, sloppy programmers WILL eventually create exploits, which you cannot really do much about aside from enforcing pretty stringent API parameters that make it very difficult to do it poorly, but it can never be made impossible. Never underestimate the capacity of an offshore hack shop or self proclaimed «php ninja» to diligently work with your system in the most insecure or non-compliant way possible, create massive vulnerabilities, and to invent any number of roundabout hacks to do so that are actually harder to pull off than just doing it the right way.

Источник

Как отключить определённые функции в PHP

Насколько целесообразно отключать некоторые функции PHP для безопасности

Говоря о безопасности, отключение ряда «опасных» функций PHP всегда идёт на последнем месте. По-настоящему безопасным веб-сайт и веб-сервер делают:

1) хорошо написанный код

2) надлежащая фильтрация и проверка любых поступающих от пользователя данных

3) своевременное обновление программного обеспечения: начиная с самого сервера и кончая CMS

Что касается блокировки «опасных» функций, то это скорее негодные средства для обеспечения информационной безопасности сайта. Если в системе найдены уязвимости, позволяющие выполнять PHP код, то хакер сможет выполнить компрометацию системы и с использованием «безопасных» функций.

Когда нужно отключать функции PHP?

Необходимость отключения функций может понадобиться на совместно используемых веб-серверах, чтобы не позволить пользователям выполнять определённые функции. Но по факту современные провайдеры хостинг услуг движуться в противоположном направлении: открывают пользователям доступ по SSH и не отключают функции PHP поскольку, повторюсь, это не относится к вопросам безопасности. Информационная безопасность веб-сервера, в том числе совместно используемого, обеспечивается другими мерами:

1) Правильно настроенными правами на файлы и директории

Как отключить функции в PHP

Чтобы сделать некоторые функции недоступными, используется:

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

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

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

Какие функции PHP нужно отключать

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

Как отключить eval в PHP

Если вы хотите отключить eval, то у вас серьёзная проблема — это не функция (это конструкция языка), поэтому с помощью disable_functions не получится отключить eval.

Для отключения eval() в PHP рекомендуют обратиться к стороннему расширению Suhosin.

Как отключить классы в PHP

Поскольку PHP это ещё и объектно-ориентированный язык, то для классов также предусмотрена возможность их отключения:

Источник

Настройка файла php.ini

Интерпретатор php может поставляться в виде модуля для Apache, выполнять скрипты из командной строки или в виде отдельного сервиса php-fpm. Эти сервисы отличаются своими возможностями, и предназначением, но для любого вида интерпретатора нужно задать базовые настройки, например, рабочая папка, включенные расширения, отображение ошибок и так далее. Все эти настройки задаются через файл php.ini. В этой инструкции мы рассмотрим как выполняется настройка файла php.ini в операционных системах Linux, хотя все информация подойдет и для Windows.

Если у вас еще не установлен интерпретатор языка программирования php, то вы можете ознакомиться со статьей установка lamp в Ubuntu 16.04.

Расположение и синтаксис php.ini

Для каждой версии интерпретатора конфигурационный файл php.ini находится в отдельной папке. Но все конфигурационные файлы находятся в папке /etc/php, например, /etc/php5:

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

Что касается синтаксиса файла, то он разделен на секции, сначала идет секция настройки php, которая разделена на подсекции в зависимости от типа настроек, дальше идут секции настройки разных модулей. Синтаксис самих настроек очень прост, он соответствует привычному синтаксису ini файлов. Строка начинается с имени настройки, затем следует знак равно, а за ним значение:

имя_настройки = значение_параметра

Символами [] обозначается имя секции, например, [PHP], а символ ; означает комментарий, он и все символы после него не читаются интерпретатором. А теперь рассмотрим как выполняется настройка php.ini и переберем самые важные параметры.

Настройка файла php.ini

Для удобства ориентирования мы разобьем все параметры по категориях в зависимости от их назначения. Вам будет достаточно найти нужный параметр и изменить его значение. А теперь откройте файл настроек php, например, для модуля apache и перейдем к настройке. Чтобы избежать ошибок не добавляйте новые строки, а ищите уже существующие и изменяйте значения на нужные:

sudo gedit /etc/php5/apache/php.ini

Сначала идет немного информации о самом файле в виде комментариев, затем интересующие нас настройки.

Вывод ошибок в php

Настройка php 7 обычно начинается с конфигурации вывода ошибок. Все настройки вывода ошибок находятся в разделе Error handling and logging. По умолчанию вывод ошибок на экран во время выполнения скрипта отключен. Это сделано для того, чтобы пользователи не смогли увидеть ничего лишнего. Вместо этого, все ошибки записываются в лог файл. Если вы используете php на домашнем компьютере, то такие меры не нужны и вы можете сразу выводить все на экран:

Замените off на on. В php используются различные типы ошибок, например, критические, предупреждения, ошибки синтаксиса, с помощью строки error_reporting вы можете включить вывод только определенных типов ошибок:

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

. Приведенный выше пример отображает все ошибки (E_ALL), кроме сообщений об устаревших функциях (E_DEPRECATED). Вы можете отключить все типы использовав 0:

Включите запись ошибок php в лог файл, если не выводите их на экран:

Чтобы не засорять лог однотипными сообщениями можно игнорировать повторяющиеся ошибки в пределах одного исполнения:

Ограничения ресурсов

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

Если указать 0, то скрипт может выполняться бесконечно. Вы также можете ограничить время, на протяжении которого скрипт будет загружать данные, 60 секунд:

Максимальное количество переменных в GET и POST:

Следующий параметр задает максимальное количество памяти, которую может использовать один скрипт во время своего выполнения, в мегабайтах:

Вы можете ограничить область действия php в системе с помощью опции openbase_dir, она указывает папку, выше которой скрипт не может получить доступ к файловой системе:

С помощью директив disable_functions и disable_classes вы можете отключить использование в скриптах определенных функций или классов, например, это может быть полезно для веб-хостингов. В этом примере мы отключаем использование функции ini_set, которая позволяет менять настройки php из скрипта:

Директории по умолчанию

Файл настройки php.ini позволяет указать пути в файловой системе по умолчанию для различных действий. Вы можете задать папки где система будет искать скрипты, если вы попытаетесь подключить их с помощью инструкции include:

Папка с модулями php:

Папка для записи временных файлов:

Загрузка файлов

Для того чтобы пользователи могли загружать свои файлы на сервер, например, фото, нужно включить эту функцию в php:

Максимальный размер загружаемого файла:

Максимальное количество файлов, которые может загрузить один скрипт:

Настройка php.ini практически завершена, нам остались лишь расширения.

Настройка расширений

Расширения позволяют очень сильно увеличить функциональность php. Например, благодаря расширениям вы можете использовать в своих скриптах базы данных mysql, postgresql, mysqli, sqlite, графическую библиотеку gd и многое другое. Все это включается в этом разделе.

Для включения расширения достаточно убрать комментарий перед строкой с его командой, например:

extension=php_mysql.so
extension=php_mbstring.so
extension=php_pgsql.so

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

Выводы

В этой статье мы рассмотрели как выполняется настройка php на сервере или обычном компьютере для разработки веб-сайтов. Файл настроек php имеет довольно простую структуру и с ним довольно не сложно справиться. После завершения всех настроек и сохранения изменений не забудьте перезагрузить веб-сервер или сервис php-fpm.

Вообще говоря, php-fpm это отдельная тема, потому что там есть много дополнительных настроек, и, возможно, мы рассмотрим его в одной из следующих статей. Если у вас остались вопросы, спрашивайте в комментариях!

Источник

Читайте также:  пасхальный кулич по английски
Образовательный портал