mirror of
https://github.com/php/doc-ru.git
synced 2026-03-24 07:42:22 +01:00
141 lines
9.3 KiB
XML
141 lines
9.3 KiB
XML
<?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&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&showerrors=1&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
|
||
-->
|