1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-25 16:22:18 +01:00
Files
archived-doc-ru/security/errors.xml
Sergey Panteleev daef8df962 Обнуление тега Reviewed (#364)
[skip-lint]
[skip-spellcheck]
2021-11-16 13:03:53 +03:00

141 lines
9.4 KiB
XML
Raw 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: 96c9d88bad9a7d7d44bfb7f26c226df7ee9ddf26 Maintainer: shein Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="security.errors" xmlns="http://docbook.org/ns/docbook">
<title>Сообщения об ошибках</title>
<para>
С точки зрения безопасности вывод сообщений об ошибках несёт в себе
как плюсы, так и минусы.
</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-разработчика достаточно привычно пользоваться
такими функциями, как <function>show_source</function>,
<function>highlight_string</function> или
<function>highlight_file</function> в целях отладки, но на работающих сайтах
это может открыть информацию о скрытых переменных, непроверенном синтаксисе и
других потенциально опасных моментах. Особенно опасно наличие кода со встроенным
механизмом отладки в публичных частях сайта. Взломщик может попытаться
запустить отладочный механизм, подбирая основные признаки отладки:
<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-скрипты. Если взломщик анализирует обычную
страницу сайта с расширением .html и пытается узнать систему, с
помощью которой работает сайт (для дальнейшего поиска уязвимых
мест), то подавая на ввод неверные данные он может обнаружить,
что система использует PHP.
</para>
<para>
Также уведомление об ошибке может дать информацию об используемой
базе данных, или, к примеру, как построена логика работы скриптов. Это, в свою очередь,
может позволить взломщику подключиться к открытому порту базы данных, либо найти
определённые ошибки в коде. Пробуя поочерёдно различные неверные блоки данных,
злоумышленник может определить порядок аутентификации в скрипте (например,
по номерам строк с ошибками) или проверять на наличие дыр различные участки кода.
</para>
<para>
Вывод стандартных ошибок или ошибок, связанных с файловой
системой, может указать, с какими привилегиями запущен
веб-сервер, и как организованы каталоги сайта. Обработка подобных ошибок,
написанная разработчиками приложения, может только усугубить проблему, если
взломщиком будет найден способ обнаружить "скрытую" отладочную информацию.
</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) { // Переменная не инициализируется или не проверяется перед использованием
$good_login = 1;
}
if ($good_login == 1) { // Если предыдущая проверка потерпела неудачу, переменная оказывается неинициализированной
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
-->