
- Введение: Зачем знать о disable_functions?
- Что такое disable_functions и как это работает?
- Методы проверки disable_functions
- Метод 1: Через PHP-скрипт (самый простой и надежный)
- Использование функции phpinfo()
- Использование функции ini_get()
- Метод 2: Попытка выполнения запрещенной функции (тестирование)
- Метод 3: Через панель управления хостингом (если доступно)
- Метод 4: Обращение в службу поддержки хостинга
- Что делать, если нужная функция запрещена?
- Заключение
Введение: Зачем знать о disable_functions?
Каждый веб-разработчик и владелец сайта, работающий с PHP, сталкивался с ситуацией, когда привычные функции отказываются работать. Часто причина кроется в настройках хостинга, а именно в директиве disable_functions файла php.ini. Эта директива позволяет хостинг-провайдеру запрещать выполнение определенных PHP-функций по соображениям безопасности, стабильности или для предотвращения злоупотребления ресурсами сервера. Понимание того, какие функции запрещены на вашем хостинге, является ключевым для отладки, оптимизации кода и выбора правильной стратегии разработки.
Особенно актуальна эта проблема для российских пользователей на общем хостинге (shared hosting), где ограничения наиболее строги. В этой статье мы рассмотрим несколько надежных методов, которые помогут вам быстро и эффективно проверить список запрещенных PHP-функций.
Что такое disable_functions и как это работает?
disable_functions – это директива в конфигурационном файле PHP (php.ini), которая содержит список функций, разделенных запятыми, выполнение которых будет запрещено. Когда PHP-скрипт пытается вызвать одну из этих функций, он либо вернет ошибку (например, Fatal error: Call to undefined function...), либо просто проигнорирует ее выполнение, в зависимости от контекста.
Примеры часто запрещаемых функций:
exec(),shell_exec(),passthru(),system(),popen(),proc_open(): Функции для выполнения системных команд. Запрещаются из соображений безопасности, чтобы вредоносный код не мог получить доступ к файловой системе сервера.phpinfo(): Раскрывает слишком много информации о конфигурации сервера, что может быть использовано злоумышленниками.symlink(),link(): Функции для создания символических ссылок, которые также могут быть использованы для обхода ограничений безопасности.mail(): Иногда запрещается для борьбы со спамом, вынуждая использовать более безопасные и контролируемые SMTP-библиотеки.file_put_contents(),file_get_contents(): Реже, но могут быть ограничены для контроля доступа к файловой системе.
Хостинг-провайдеры используют эту директиву для создания безопасной и стабильной среды для множества клиентов на одном сервере. Это позволяет предотвратить утечки данных, замедление работы сервера из-за неоптимизированного кода или зловредных действий.
Методы проверки disable_functions
Метод 1: Через PHP-скрипт (самый простой и надежный)
Этот метод является наиболее распространенным и эффективным. Он позволяет получить информацию непосредственно от самого PHP-интерпретатора, работающего на вашем хостинге.
Использование функции phpinfo()
Создайте файл (например, info.php) в корне вашего сайта или в любой доступной директории со следующим содержимым:
<?php
phpinfo();
?>
Затем откройте этот файл в браузере (например, ваш_сайт.ru/info.php). На открывшейся странице найдите раздел Core. В нем вы увидите строку disable_functions со списком запрещенных функций.
Важно: После получения необходимой информации, обязательно удалите этот файл с сервера. Он содержит конфиденциальную информацию о конфигурации вашего PHP, которая может быть использована злоумышленниками!
Использование функции ini_get()
Если phpinfo() сам по себе запрещен или вы предпочитаете более контролируемый метод, можно использовать ini_get(). Создайте файл (например, check_disabled.php) со следующим кодом:
<?php
$disabled_functions = ini_get('disable_functions');
if (!empty($disabled_functions)) {
echo "<h3>Список запрещенных PHP-функций:</h3><ul>";
$functions_array = explode(',', $disabled_functions);
foreach ($functions_array as $func) {
echo "<li>" . trim($func) . "</li>";
}
echo "</ul>";
} else {
echo "<p>Директива disable_functions пуста или не задана. Возможно, функции не запрещены или метод не подходит.</p>";
}
?>
Этот скрипт выведет аккуратный список всех запрещенных функций, если таковые имеются.
Метод 2: Попытка выполнения запрещенной функции (тестирование)
Если вы подозреваете, что какая-то конкретная функция запрещена, можно попробовать ее выполнить и обработать возможные ошибки. Этот метод менее универсален, но может быть полезен для точечной проверки.
<?php
// Пример проверки функции exec
if (function_exists('exec')) {
try {
$output = exec('echo "Hello from shell"');
echo "<p>Функция <b>exec()</b> работает. Вывод: " . htmlspecialchars($output) . "</p>";
} catch (Throwable $e) {
echo "<p>Ошибка при вызове <b>exec()</b>: " . htmlspecialchars($e->getMessage()) . "</p>";
}
} else {
echo "<p>Функция <b>exec()</b> недоступна (возможно, запрещена).</p>";
}
// Пример проверки функции shell_exec
if (function_exists('shell_exec')) {
$output_shell = shell_exec('whoami');
if ($output_shell === null) {
echo "<p>Функция <b>shell_exec()</b> недоступна или запрещена.</p>";
} else {
echo "<p>Функция <b>shell_exec()</b> работает. Вывод: " . htmlspecialchars($output_shell) . "</p>";
}
} else {
echo "<p>Функция <b>shell_exec()</b> недоступна (возможно, запрещена).</p>";
}
?>
Обратите внимание, что не все запрещенные функции вызовут Throwable (исключение). Некоторые просто вернут false или null.
Метод 3: Через панель управления хостингом (если доступно)
Многие современные панели управления хостингом, такие как ISPmanager, cPanel или Plesk, предоставляют возможность просмотра или даже частичного управления настройками PHP. В зависимости от панели и политики хостинга, вы можете найти информацию о disable_functions в разделах, посвященных настройкам PHP.
- ISPmanager: Обычно это в разделе «Сайты» > «PHP» или «Настройки PHP». Выберите нужную версию PHP и найдите соответствующие параметры.
- cPanel: Ищите разделы «Выбор версии PHP» или «Редактор MultiPHP INI».
- Plesk: Проверьте в «Настройки PHP» для вашего домена.
Некоторые хостинги могут отображать список напрямую, другие – только позволять включать/выключать определенные модули или режимы безопасности, косвенно влияющие на доступность функций.
Метод 4: Обращение в службу поддержки хостинга
Если все вышеперечисленные методы не дали результата или вы хотите получить официальную информацию, самый прямой путь – обратиться в службу поддержки вашего хостинг-провайдера. Сформулируйте свой запрос четко, например: «Прошу предоставить список PHP-функций, запрещенных директивой disable_functions для моего аккаунта.»
Сотрудники поддержки обязаны предоставить вам эту информацию, так как она критически важна для работы вашего сайта.
Что делать, если нужная функция запрещена?
Обнаружив, что необходимая функция запрещена, не отчаивайтесь. Есть несколько путей решения:
- Поиск альтернативы: Для многих запрещенных функций существуют безопасные аналоги. Например, вместо
file_get_contents()для удаленных URL часто можно использовать библиотеку cURL (если она не запрещена). Для отправки почты вместоmail()используйте PHPMailer или SwiftMailer, которые работают через SMTP. - Изменение логики кода: Иногда можно перестроить логику приложения, чтобы избежать использования запрещенной функции.
- Смена хостинга: Если ваш проект требует полной свободы и контроля над PHP-функциями, возможно, пришло время перейти на виртуальный выделенный сервер (VPS) или выделенный сервер. На таких типах хостинга вы имеете полный доступ к
php.iniи можете самостоятельно управлять спискомdisable_functions. - Запрос в поддержку: В редких случаях, если функция критически важна и не несет прямых угроз безопасности, вы можете попробовать обратиться в поддержку с просьбой о ее включении. Шансы невелики на общем хостинге, но попытка не пытка.
Заключение
Понимание ограничений вашего хостинг-окружения – это основа для стабильной и безопасной работы веб-приложений. Проверка списка запрещенных PHP-функций с помощью представленных методов поможет вам избежать многих проблем на этапе разработки и эксплуатации. Всегда помните о безопасности, особенно при использовании phpinfo(), и не стесняйтесь обращаться за помощью к вашему хостинг-провайдеру. Успешной вам разработки!








