Как скрыть все ошибки PHP с помощью .htaccess
В этом уроке мы научимся такой вещи как сокрытие ошибок PHP. Попутно мы также разберём, как не просто подавлять вывод этих ошибок, но и как записывать их в файл журнала, как защитить этот файл журнала, как настроить уровень сообщения об ошибках PHP (насколько серьёзные ошибки показывать, показывать ли предупреждения), научимся устанавливать максимальный размер строки ошибки и отключим запись повторяющихся ошибок.
Нужно ли прятать PHP ошибки
PHP ошибки выдают самую разнообразную информацию, которая позволяет нападающим собрать данные о вашем сайте и вашем сервере. Но если бы на этот вопрос был однозначный ответ «да», то всё решалось бы добавлением в каждый файл с программами PHP одной единственной строки
На самом деле, все ошибки, в том числе и предупреждения (некритические ошибки) нужно выводить на стадии тестирования. Вывод ошибок и предупреждения также поможет разобраться в имеющихся (или возможных) проблемах в рабочем окружении. Не стоит подавлять вывод ошибок и предупреждений в программах, предназначенных для свободного распространения, поскольку при возникновении проблем все репорты пользователей о проблемах будут одинаковыми: «там белый экран», что сильно затруднит попытки разобраться.
В общем, на серверах, предназначенных для разработки (например, на домашнем сервере), не нужно убирать ошибки и предупреждения PHP методами error_reporting(0); и @ — нужно изучить их причины и исправлять исходный код.
На рабочих серверах крайне рекомендуется не показывать всем ошибки, которые возникли в PHP коде, но рекомендуется не просто подавлять их показ, но ещё и вести их лог, записывать для системного администратора и для программиста на PHP — из этих логов они получат важную информацию о возможных проблемах на сайте/сервере.
Как включить журналирование ошибок PHP посредством .htaccess
В этой части урока я покажу пользователям Apache как подавить вывод ошибок PHP и скрыть их от посетителей, при этом будет включена запись PHP ошибок для их дальнейшего анализа, вся эта настройка будет осуществлена через файл .htaccess.
Вообще, этот способ обладает ещё одним замечательным плюсом — вместо того, чтобы пытаться переловить все PHP ошибки и предупреждения, мы каждое из них будем записывать в наш личный лог, благодаря этому не ускользнёт ни одна возникшая ошибка, даже если она возникла не у вас, а у кого-то посетителя вашего сайта при условиях которые, может быть, вам бы даже и в голову не пришли для моделирования. Благодаря магической мощи файла .htaccess есть простой способ реализовать эту эффективную стратегию.
Прячем PHP ошибки от посетителей
Есть разные способы подавить ошибки PHP посредством .htaccess. Это можно сделать включением следующих директив .htaccess в файл вашего домена httpd.conf или в корневую (или любую другую целевую директорию) файла .htaccess со следующим содержимым:
Это приведёт к тому, что PHP ошибки больше не будут публичными на вашем сайте. Это исключает потенциальные риски безопасности, и не даёт этим уродским, непонятным PHP ошибках поломать вёрстку вашего сайта и дезориентировать ваших посетителей. Редактирования кода для этого не требуется.
Включение личного журнала PHP ошибок
Теперь, когда мы спрятали PHP ошибки от общественности, давайте включим их журналирование (запись), чтобы мы могли их отследить. Это делается добавлением следующих директив .htaccess к файлу вашего домена httpd.conf или в ваш файл .htaccess, который размещён в корневой (или любой целевой) директории.
Чтобы это заработало, вам нужно отредактировать путь в последней строчке в соответствии с действительным расположением вашего файла PHP_errors.log. Конечно, вместе с этим вам нужно создать этот файл и дать ему разрешения 755 или, если необходимо, 777. Наконец, вам нужно обезопасить этот файл журнала, добавив эти завершающие строки кода в ваш файл .htaccess:
Теперь, когда всё на месте, проверьте, что всё работает как следует, вызовите несколько ошибок PHP. Вы также, возможно, захотите проверить защиту вашего файла журнала, попробовав получить к нему доступ через браузер.
Продвинутая обработка ошибок PHP с помощью .htaccess
Давайте теперь глубже окунёмся в эту тему, добавим дополнительной функциональности и исследуем различные реализации. В первую очередь мы исследуем работу с ошибками PHP для рабочего окружения (например, для веб-сайтов и приложений, которые находятся онлайн, активны и являются публичными), затем мы рассмотрим работу с ошибками для окружения разработчика (например, для проектов под разработкой, тестирования, частных, т. д.).
Контролирование уровня сообщения ошибок PHP
Используя .htaccess возможно настроить уровень сообщения ошибок, который подходит под ваши практические нужды. Общий форт для контролирования уровня ошибок PHP следующий:
Есть несколько распространённых значений, которые можно подставить вместо «цифра», в том числе:
- Самое полное сообщение об ошибках (соответствует E_ALL) — для этого используйте значение «32767».
- Полное сообщение об ошибках — для полной записи ошибок PHP используйте величину «8191», которая включит запись всего, кроме уведомлений времени выполнения об использовании устаревших конструкций (предупреждения о коде, который не будет работать в следующих версиях PHP).
- Сообщение об ошибках Zend — для записи как фатальных, так и не фатальных предупреждениях времени компиляции, генерируемых скриптовым движком Zend, используйте «192».
- Сообщение о базовых ошибках — записывать уведомления времени выполнения. Указывают на то, что во время выполнения скрипта произошло что-то, что может указывать на ошибку, хотя это может происходить и при обычном выполнении программы. Для этого используйте цифру «8».
- Минимальное сообщение об ошибках — записывать только фатальные ошибки времени выполнения. Это неустранимые средствами самого скрипта ошибки, такие как ошибка распределения памяти и т.п. Выполнение скрипта в таком случае прекращается. Для этого используйте цифру «1».
Конечно можно использовать и другие значения («цифры») для тонкой настройки того, какие именно ошибки вы хотите фиксировать. Некоторые разъяснения по данному вопросу в самом низу.
Настраиваем максимальный размер файла для записей ваших ошибок
Используя .htaccess вы можете определить максимальный размер для ваших ошибок PHP. Имеется ввиду контроль размера каждой записанной ошибки, а не всего файла в целом. Синтаксис имеет следующий вид:
Здесь «целове_число» представляет максимальный размер каждой записанной строки ошибки в байтах. По умолчанию значение равно «1024» (т. е. 1 килобайт). Чтобы удалить этот лимит можно установить значение «0». Помните, .что это значение также применяется для отображаемых ошибок, когда они включены (например, во время разработки).
Отключение записи повторяющихся ошибок
Если вы уже успели поработать с журналом ошибок, вы могли обратить внимание, что в нём множество похожих записей, которые различаются только временем события. От этой избыточности можно избавиться, просто добавьте в файл htaccess эти строки:
При таких настройках повторяющиеся ошибки не будут записываться в ружнал, даже если они случились в различных источниках или адресах. Если вы хотите отключить повторяющиеся ошибки только из одного источника или файла, просто закомментируйте или удалите последнюю строку. И наоборот, чтобы убедиться, что ваш файл журнала событий включает все повторяющиеся ошибки, измените обе величины с on на off.
Собираем всё вместе — рабочее окружение
Обсудив особенности настройки записи ошибок PHP, давайте соберём все наши записи в один файл .htaccess. Данные настройки оптимизированы для рабочего окружения.
Если вы считаете хорошим стилем код с пояснениями, то этот же код, но с комментариями:
Приведённая стратегия идеальна для публичного сервера в рабочем окружении. Все ошибки скрыты от посторонних глаз, при этом они аккуратно собираются для администраторов и программистов. Конечно, вы можете настроить приведённые директивы под себя, чтобы они идеально подходили под ваши задачи. А теперь давайте рассмотрим стратегию работы с ошибками для окружения разработки.
Собираем всё вместе — окружение разработки
Разрабатывая или отлаживая программу, удобнее отслеживать возникающие PHP ошибки в режиме реального времени, прямо в браузере. Пример .htaccess с соответствующими настройками под окружение разработки приведён ниже:
Не будем объяснять каждую строку — вы можете посмотреть соответствующие разъяснения чуть повыше.
Подсказки
Чтобы узнать абсолютный путь до лог файла на сервере методами PHP (для директивы php_value error_log)
Пример .htaccess для сервера на Widnows, установленного по этой инструкции.
Не работает
Этот способ не применим на хостингах, где PHP работает как CGI (возможные пути решения будут показаны в следующей статье).
0 для отображения всех ошибок PHP
В директиве php_value error_reporting для отображения всех ошибок можно указать -1 или
0. Т.е. строки выглядят так:
Причём более правильным считается именно второй способ, т. е. с использованием
Предопределенные константы и побитовые операции error_reporting
Для ознакомления рекомендуются следующие страницы справки PHP
- Предопределенные константы
- Побитовые операторы
Например, если мы хотим записывать ТОЛЬКО следующие ошибки E_ERROR (значение 1), E_WARNING (значение 2), E_CORE_ERROR (значение 16), то для получения соответствующейо числовой величины следовало бы перевести эти величины в двоичные числа и произвести соответствующие побитовые операции, а потом полученное двоичное число перевести в десятеричное. Тем не менее, эту операцию можно упростить — достаточно сложить значения десятеричных чисел. Т.е. в нашем случае это 1+2+16=19
будет отображать ошибки E_ERROR, E_WARNING и E_CORE_ERROR.
Пример абсолютного пути до лог файла на хостинге Hostland (для директивы php_value error_log)
Вместо host900456 нужно указать ваш аккаунт.
Вместо codeby.net нужно указать ваш домен.
Кстати, хороший хостинг, на котором работает этот самый сайт. Рекомендуем!
Оставьте ответ Отменить ответ
С 20 по 22 апреля пройдут незабываемые битвы среди кибер-гладиаторов в мире информационной безопасности!
Открыта регистрация команд по ссылке .
Отображение / скрытие всех ошибок PHP
По умолчанию, для обеспечения работы невалидного кода, в PHP отображаются не все ошибки. Это сравнимо с разницей между HTML и XHTML. Однако, так как PHP — язык программирования, то здесь это касается безопасности.
Отображение
Чтобы PHP выводил все ошибки, нужно использовать в начале скрипта функцию error_reporting() , с параметром -1 :
Это очень полезно не только при отладке скриптов, но и при изучении данного языка программирования.
Скрытие
Чтобы PHP скрывал все ошибки, нужно использовать в начале скрипта функцию error_reporting() , с параметром 0 :
Вывод ошибок PHP
Как правило, хостинг-провайдеры отключают или блокируют показ ошибок PHP. Подобные ограничения вводятся потому что информацией об ошибках могут воспользоваться злоумышленники. Поэтому на рабочих серверах нежелательно включать вывод ошибок на экран.
При разработке сайтов и скриптов крайне важно отслеживать возникающие проблемы. Также эта информация нужна и системным администраторам, чтобы своевременно предотвращать сбои в работе сайта и сервера.
Лучшим вариантом будет отключить вывод ошибок на экран и настроить отображение ошибок в логах. Так вы сможете отслеживать возникающие проблемы, не подвергая сервер угрозе.
В статье мы расскажем, как отключить или включить отображение ошибок PHP при помощи .htaccess, через скрипт PHP и с помощью файла php ini.
Обратите внимание: в некоторых случаях изменить настройки вывода можно только через обращение в техническую поддержку.
Способы включения и отключения вывода ошибок PHP
Через .htaccess
Перейдите в корневую папку сайта. Путь к корневой папке можно посмотреть в разделе «Хостинг» > «Сайты» в колонке «Папка»:
Открыть папку можно в разделе «Хостинг» > «Файловый менеджер». Другой способ перейти к папке: в разделе «Хостинг» > «Сайты» в колонке «Операции» нажмите Открыть папку.
В корневой папке откройте файл .htaccess. Если файла не существует, создайте его.
Чтобы вывести ошибки, добавьте в файл следующие строки:
Чтобы отключить ошибки PHP, добавьте в файл строки:
Так же отключить отображение PHP error можно используя строки:
Через логи PHP
Проверить или скрыть ошибки в определенных файлах можно при помощи вызова PHP-функций.
Способ 1. Для вывода ошибок используйте функцию error_reporting. Пропишите необходимое вам значение в зависимости от того, какие ошибки вы хотите увидеть.
- Функция для вывода всех ошибок:
- Функция для вывода всех ошибок, за исключением типа Notice:
- Отключение вывода:
- Отключение логирования повторяющихся ошибок:
Способ 2. Этот метод подойдет для проверки конкретной части кода. Пропишите необходимое вам значение в зависимости от того, какие типы ошибок вы хотите увидеть.
Команда для вывода всех ошибок выглядит следующим образом:
После этого добавьте:
Способ 3. Другой вариант включения вывода ошибок через скрипт:
Для отключения добавьте строки:
Способ 4. Для подключения вывода с логированием через конфигурацию веб-сервера введите:
- для Apache:
- для Nginx:
Подробнее о других аргументах вы можете прочитать в документации PHP на официальном сайте php.net.
Через файл php.ini
Включить отслеживание ошибок можно с помощью файла php.ini. Такой способ подойдет тем, кто хочет отобразить или скрыть ошибки для всего сайта или кода.
Важно! Настройка отслеживания ошибок через файл php.ini есть не у всех, так как некоторые хостинг-провайдеры частично или полностью закрывают доступ к файлу.
Способ 1. Показать все ошибки можно добавив в php.ini строку:
После этого перезагрузите сервер:
Способ 2. Включить вывод ошибок можно при помощи error_reporting. После знака «=» пропишите необходимое вам значение в зависимости от того, какие типы ошибок вы хотите увидеть.
Можно ли в PHP отключить ошибки и когда это нужно делать
От автора: за свои ошибки нужно отвечать! Их нужно исправлять! Но ведь можно исправить как-нибудь потом, когда будет время? В настоящей жизни такое не всегда возможно, а на своем сайте для этого нужно лишь в PHP отключить ошибки.
Зачем прятать свои программные «недостатки»?
Тут, однако, «попахивает» философией, господа разработчики! А программирование и философия – это далеко идущие друг от друга дисциплины. Понятно, что если скрыть свои баги в коде, тогда будет не так стыдно. И никто не узнает, что вы только начинающий программист :).
В программировании желание убрать ошибки PHP не всегда говорит о непорядочности веб-разработчика. А скорее наоборот: таким образом он пытается обезопасить систему работающего ресурса от взлома и «не напрягать» пользователей отображением сообщений о существующих «недугах» в коде сайта.
Вывод ошибок приветствуется и востребован только на этапе «зарождения» нового ресурса. При его создании каждый из модулей движка должен пройти скрупулезную стадию тестирования. И все для того, чтобы затем корректно работать в составе всей системы.
С помощью сообщений, выдаваемых ядром языка, разработчик узнает о существующей проблеме. Дополнительно каждое уведомление об ошибке сопровождается коротким пояснением характера ее происхождения. Что позволяет разработчику как можно быстрее исправить допущенный «прокол».
Профессия PHP-разработчик с нуля до PRO
Готовим PHP-разработчиков с нуля
Вы с нуля научитесь программировать сайты и веб-приложения на PHP, освоите фреймворк Laravel, напишете облачное хранилище и поработаете над интернет-магазином в команде. Сможете устроиться на позицию Junior-разработчика.
Отображение системных сообщений не только портит впечатление пользователей о ресурсе, но и делает его крайне уязвимым. Вот почему так важно отключать показ ошибок в PHP на работающем сайте.
Пример уязвимости
На следующем примере я попытаюсь доказать вам, что афишировать свои программные ошибки не всегда безопасно. Предположим, что сайт работает на каком-то движке, написанном с помощью MySQL и PHP. В одном из скриптов невыспавшийся кодер неправильно прописал пароль в строке подключения.
После запуска скрипта на сайте все пользователи увидят на экране описание данной ошибки. А хакер – получит логин пользователя без всякого взлома, «шума и пыли». Гляньте на следующий скриншот:
Закрываем дыру
В коде такую серьезную прореху можно «закрыть» с помощью «собаки». Точнее, символа «@». Пример: