PHP 8.4.2 Released!

Сообщения об ошибках

С точки зрения PHP-безопасности вывод ошибок несёт как вред, так и пользу.

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

Пример #1 Атака на переменные в HTML-странице

<form method="post" action="attacktarget?username=badfoo&amp;password=badfoo">
    <input type="hidden" name="username" value="badfoo" />
    <input type="hidden" name="password" value="badfoo" />
</form>

При отладке сообщения об ошибках в PHP-коде возвращают полезную для разработчика информацию: показывают функцию, номер строки в файле или PHP-файл, в которых произошёл сбой. Эта информация помогает злоумышленнику во взломе. PHP-разработчик часто пользуется функциями show_source(), highlight_string() и highlight_file() как методами отладки, но на живых сайтах это раскрывает скрытые переменные, непроверенный синтаксис и другую опасную информацию. Повышенную опасность несёт запуск в публичных частях сайта открытого исходного кода со встроенными механизмами и методами отладки. Злоумышленник попытается взломать страницу методом перебора, или «грубой силы» (англ. brute force), путём отправки общих строк отладки, если узнает, какой техникой отладки пользуется разработчик:

Пример #2 Пример стандартных отладочных переменных

<form method="post" action="attacktarget?errors=Y&amp;showerrors=1&amp;debug=1">
    <input type="hidden" name="errors" value="Y" />
    <input type="hidden" name="showerrors" value="1" />
    <input type="hidden" name="debug" value="1" />
</form>

Открытость системы к проверке ошибок снабжает злоумышленника дополнительной информацией независимо от метода обработки ошибок.

Сам стиль стандартной информации о PHP-ошибке указывает, что система работает на PHP. При просмотре .html-страницы и исследовании бэкенда в поиске слабых мест в системе, взломщик вводит неверные данные и узнаёт, что систему построили на PHP.

Вывод информации об ошибке, которая возникла в функции, сообщает, работает ли в системе конкретный движок базы данных, или даёт подсказки, как запрограммировали или спроектировали веб-страницу. Это помогает злоумышленнику глубже исследовать открытые порты базы данных или искать конкретные ошибки и слабые места на веб-странице. Злоумышленник передаёт неверные данные и по номерам строк с ошибками определяет порядок аутентификации в скрипте, или проверяет, содержит ли код другие бреши, которые получится использовать в отдельных частях скрипта.

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

Проблему решают тремя базовыми способами. Первый способ — тщательно изучить каждую функцию и компенсировать бо́льшую часть ошибок. Второй — отключить вывод сообщений об ошибках в запущенном коде. И третий способ — использовать функции, которые устанавливают пользовательский обработчик PHP-ошибок. Иногда защищаются всеми тремя способами, в зависимости от политики безопасности, которую принял для себя разработчик.

Способ заранее обнаружить проблему вывода конфиденциальной информации — изменить уровень сообщений об ошибках в PHP-коде функцией error_reporting(), которая помогает защитить код и выявить опасные переменные. На время тестирования кода, перед развёртыванием в рабочей среде, вывод сообщений об ошибках устанавливают на уровень E_ALL, с которым быстро находят области, в которых переменные открываются для «заражения» — подмены или модификации. С момента готовности кода к развёртыванию требуется вызывать функцию error_reporting() со значением 0, чтобы отключить вывод сообщений об ошибках, либо отключить вывод ошибок в файле php.ini — через директиву display_errors, чтобы изолировать код от проверки. Разработчику потребуется также определить путь к файлу лога через директиву error_log и включить директиву log_errors.

Пример #3 Поиск опасных переменных с выводом ошибок уровня E_ALL

<?php

if ($username) { // Переменную $username не инициализировали — не установили начальное значение — и не проверили
$good_login = 1;
}

if (
$good_login == 1) { // Переменная $good_login не проинициализируется, а проверка не пройдёт,
// если предыдущая проверка провалится
readfile ("/highly/sensitive/data/index.html");
}

?>

Добавить

Примечания пользователей 1 note

up
13
earlz- -NO SPAM-- at earlz dot biz DOT tm
15 years ago
Note for those of you using OpenBSD and PHP. The default php.ini has display_errors=off . This is contrary to the PHP default of display_errors=on . If your having trouble seeing errors on OpenBSD make sure to edit your php.ini to have display_errors=on. (I had this problem on OpenBSD 4.4)
To Top