1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-23 23:32:16 +01:00
Files
archived-doc-ru/security/errors.xml
2024-07-26 11:14:07 +03:00

141 lines
9.3 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: ae725a44023db78b9f6e9d2a0baac8c8dc337d38 Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="security.errors" xmlns="http://docbook.org/ns/docbook">
<title>Сообщения об ошибках</title>
<para>
С точки зрения PHP-безопасности вывод ошибок несёт как вред, так и пользу.
</para>
<para>
Стандартная тактика атаки состоит в профилировании системы: ввод неправильных данных
и анализ содержания и характера сообщений об ошибках. Взломщик получает
информацию о сервере и определяет слабые места. Пример атаки: взломщик получает
информацию о странице после отправки формы, а затем переопределяет или изменяет
передаваемые значения:
<example>
<title>Атака на переменные в HTML-странице</title>
<programlisting role="html">
<![CDATA[
<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>
]]>
</programlisting>
</example>
</para>
<para>
При отладке сообщения об ошибках в PHP-коде возвращают полезную для разработчика
информацию: показывают функцию, номер строки в файле или PHP-файл, в которых произошёл сбой.
Эта информация помогает злоумышленнику во взломе. PHP-разработчик часто пользуется
функциями <function>show_source</function>, <function>highlight_string</function>
и <function>highlight_file</function> как методами отладки, но на живых сайтах
это раскрывает скрытые переменные, непроверенный синтаксис
и другую опасную информацию. Повышенную опасность несёт запуск
в публичных частях сайта открытого исходного кода со встроенными механизмами и методами отладки.
Злоумышленник попытается взломать страницу методом перебора, или «грубой силы» (англ. brute force),
путём отправки общих строк отладки, если узнает,
какой техникой отладки пользуется разработчик:
<example>
<title>Пример стандартных отладочных переменных</title>
<programlisting role="html">
<![CDATA[
<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>
]]>
</programlisting>
</example>
</para>
<para>
Открытость системы к проверке ошибок
снабжает злоумышленника дополнительной информацией
независимо от метода обработки ошибок.
</para>
<para>
Сам стиль стандартной информации о PHP-ошибке указывает,
что система работает на PHP. При просмотре
<literal>.html</literal>-страницы и исследовании бэкенда в поиске слабых мест в системе,
взломщик вводит неверные данные и узнаёт, что систему построили на PHP.
</para>
<para>
Вывод информации об ошибке, которая возникла в функции, сообщает, работает ли в системе
конкретный движок базы данных, или даёт подсказки, как запрограммировали
или спроектировали веб-страницу. Это помогает злоумышленнику глубже исследовать
открытые порты базы данных или искать конкретные ошибки
и слабые места на веб-странице. Злоумышленник передаёт неверные данные
и по номерам строк с ошибками определяет порядок аутентификации в скрипте, или проверяет,
содержит ли код другие бреши, которые получится использовать в отдельных частях скрипта.
</para>
<para>
Вывод информации об ошибках в файловой системе или стандартных PHP-ошибок сообщает, с какими
привилегиями запустили веб-сервер, и как организовали каталоги сервера.
Коды ошибок в отладочной информации, которые записал разработчик, усугубляют проблему
и упрощают доступ к информации, которая раньше была «скрыта».
</para>
<para>
Проблему решают тремя базовыми способами. Первый способ —
тщательно изучить каждую функцию и компенсировать бо́льшую часть ошибок.
Второй — отключить вывод сообщений об ошибках в запущенном коде.
И третий способ — использовать функции, которые устанавливают пользовательский
обработчик PHP-ошибок. Иногда защищаются всеми тремя способами,
в зависимости от политики безопасности, которую принял для себя разработчик.
</para>
<para>
Способ заранее обнаружить проблему вывода конфиденциальной информации —
изменить уровень сообщений об ошибках в PHP-коде функцией <function>error_reporting</function>,
которая помогает защитить код и выявить опасные переменные.
На время тестирования кода, перед развёртыванием в рабочей среде,
вывод сообщений об ошибках устанавливают на уровень <constant>E_ALL</constant>,
с которым быстро находят области, в которых переменные открываются
для «заражения» — подмены или модификации.
С момента готовности кода к развёртыванию требуется вызывать функцию <function>error_reporting</function>
со значением 0, чтобы отключить вывод сообщений об ошибках,
либо отключить вывод ошибок в файле &php.ini; — через директиву <literal>display_errors</literal>,
чтобы изолировать код от проверки. Разработчику потребуется также
определить путь к файлу лога через директиву <literal>error_log</literal>
и включить директиву <literal>log_errors</literal>.
<example>
<title>Поиск опасных переменных с выводом ошибок уровня E_ALL</title>
<programlisting role="php">
<![CDATA[
<?php
if ($username) { // Переменную $username не инициализировали — не установили начальное значение — и не проверили
$good_login = 1;
}
if ($good_login == 1) { // Переменная $good_login не проинициализируется, а проверка не пройдёт,
// если предыдущая проверка провалится
readfile ("/highly/sensitive/data/index.html");
}
?>
]]>
</programlisting>
</example>
</para>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->