mirror of
https://github.com/php/doc-ru.git
synced 2026-03-25 16:22:18 +01:00
141 lines
9.4 KiB
XML
141 lines
9.4 KiB
XML
<?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&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&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-скрипты. Если взломщик анализирует обычную
|
||
страницу сайта с расширением .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
|
||
-->
|