<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/security.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ru',
  ),
  'this' => 
  array (
    0 => 'security.errors.php',
    1 => 'Сообщения об ошибках',
    2 => 'Сообщения об ошибках',
  ),
  'up' => 
  array (
    0 => 'security.php',
    1 => 'Безопасность',
  ),
  'prev' => 
  array (
    0 => 'security.database.sql-injection.php',
    1 => 'SQL-инъекции',
  ),
  'next' => 
  array (
    0 => 'security.variables.php',
    1 => 'Данные пользовательского ввода',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ru',
    'path' => 'security/errors.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="security.errors" class="chapter">
   <h1 class="title">Сообщения об ошибках</h1>

   <p class="para">
    С точки зрения PHP-безопасности вывод ошибок несёт как вред, так и пользу.
   </p>
   <p class="para">
    Стандартная тактика атаки состоит в профилировании системы: ввод неправильных данных
    и анализ содержания и характера сообщений об ошибках. Взломщик получает
    информацию о сервере и определяет слабые места. Пример атаки: взломщик получает
    информацию о странице после отправки формы, а затем переопределяет или изменяет
    передаваемые значения:
    <div class="example" id="example-1">
     <p><strong>Пример #1 Атака на переменные в HTML-странице</strong></p>
     <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;form method=&quot;post&quot; action=&quot;attacktarget?username=badfoo&amp;amp;password=badfoo&quot;&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;username&quot; value=&quot;badfoo&quot; /&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;password&quot; value=&quot;badfoo&quot; /&gt;
&lt;/form&gt;</pre>
</div>
     </div>

    </div>
   </p>
   <p class="para">
    При отладке сообщения об ошибках в PHP-коде возвращают полезную для разработчика
    информацию: показывают функцию, номер строки в файле или PHP-файл, в которых произошёл сбой.
    Эта информация помогает злоумышленнику во взломе. PHP-разработчик часто пользуется
    функциями <span class="function"><a href="function.show-source.php" class="function">show_source()</a></span>, <span class="function"><a href="function.highlight-string.php" class="function">highlight_string()</a></span>
    и <span class="function"><a href="function.highlight-file.php" class="function">highlight_file()</a></span> как методами отладки, но на живых сайтах
    это раскрывает скрытые переменные, непроверенный синтаксис
    и другую опасную информацию. Повышенную опасность несёт запуск
    в публичных частях сайта открытого исходного кода со встроенными механизмами и методами отладки.
    Злоумышленник попытается взломать страницу методом перебора, или «грубой силы» (англ. brute force),
    путём отправки общих строк отладки, если узнает,
    какой техникой отладки пользуется разработчик:
    <div class="example" id="example-2">
     <p><strong>Пример #2 Пример стандартных отладочных переменных</strong></p>
     <div class="example-contents">
<div class="htmlcode"><pre class="htmlcode">&lt;form method=&quot;post&quot; action=&quot;attacktarget?errors=Y&amp;amp;showerrors=1&amp;amp;debug=1&quot;&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;errors&quot; value=&quot;Y&quot; /&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;showerrors&quot; value=&quot;1&quot; /&gt;
    &lt;input type=&quot;hidden&quot; name=&quot;debug&quot; value=&quot;1&quot; /&gt;
&lt;/form&gt;</pre>
</div>
     </div>

    </div>
   </p>
   <p class="para">
    Открытость системы к проверке ошибок
    снабжает злоумышленника дополнительной информацией
    независимо от метода обработки ошибок.
   </p>
   <p class="para">
    Сам стиль стандартной информации о PHP-ошибке указывает,
    что система работает на PHP. При просмотре
    <code class="literal">.html</code>-страницы и исследовании бэкенда в поиске слабых мест в системе,
    взломщик вводит неверные данные и узнаёт, что систему построили на PHP.
   </p>
   <p class="para">
    Вывод информации об ошибке, которая возникла в функции, сообщает, работает ли в системе
    конкретный движок базы данных, или даёт подсказки, как запрограммировали
    или спроектировали веб-страницу. Это помогает злоумышленнику глубже исследовать
    открытые порты базы данных или искать конкретные ошибки
    и слабые места на веб-странице. Злоумышленник передаёт неверные данные
    и по номерам строк с ошибками определяет порядок аутентификации в скрипте, или проверяет,
    содержит ли код другие бреши, которые получится использовать в отдельных частях скрипта.
   </p>
   <p class="para">
    Вывод информации об ошибках в файловой системе или стандартных PHP-ошибок сообщает, с какими
    привилегиями запустили веб-сервер, и как организовали каталоги сервера.
    Коды ошибок в отладочной информации, которые записал разработчик, усугубляют проблему
    и упрощают доступ к информации, которая раньше была «скрыта».
   </p>
   <p class="para">
    Проблему решают тремя базовыми способами. Первый способ —
    тщательно изучить каждую функцию и компенсировать бо́льшую часть ошибок.
    Второй — отключить вывод сообщений об ошибках в запущенном коде.
    И третий способ — использовать функции, которые устанавливают пользовательский
    обработчик PHP-ошибок. Иногда защищаются всеми тремя способами,
    в зависимости от политики безопасности, которую принял для себя разработчик.
   </p>
   <p class="para">
    Способ заранее обнаружить проблему вывода конфиденциальной информации —
    изменить уровень сообщений об ошибках в PHP-коде функцией <span class="function"><a href="function.error-reporting.php" class="function">error_reporting()</a></span>,
    которая помогает защитить код и выявить опасные переменные.
    На время тестирования кода, перед развёртыванием в рабочей среде,
    вывод сообщений об ошибках устанавливают на уровень <strong><code><a href="errorfunc.constants.php#constant.e-all">E_ALL</a></code></strong>,
    с которым быстро находят области, в которых переменные открываются
    для «заражения» — подмены или модификации.
    С момента готовности кода к развёртыванию требуется вызывать функцию <span class="function"><a href="function.error-reporting.php" class="function">error_reporting()</a></span>
    со значением 0, чтобы отключить вывод сообщений об ошибках,
    либо отключить вывод ошибок в файле <var class="filename">php.ini</var> — через директиву <code class="literal">display_errors</code>,
    чтобы изолировать код от проверки. Разработчику потребуется также
    определить путь к файлу лога через директиву <code class="literal">error_log</code>
    и включить директиву <code class="literal">log_errors</code>.
    <div class="example" id="example-3">
     <p><strong>Пример #3 Поиск опасных переменных с выводом ошибок уровня E_ALL</strong></p>
     <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">$username</span><span style="color: #007700">) {  </span><span style="color: #FF8000">// Переменную $username не инициализировали — не установили начальное значение — и не проверили<br />    </span><span style="color: #0000BB">$good_login </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />}<br /><br />if (</span><span style="color: #0000BB">$good_login </span><span style="color: #007700">== </span><span style="color: #0000BB">1</span><span style="color: #007700">) { </span><span style="color: #FF8000">// Переменная $good_login не проинициализируется, а проверка не пройдёт,<br />                        // если предыдущая проверка провалится<br />    </span><span style="color: #0000BB">readfile </span><span style="color: #007700">(</span><span style="color: #DD0000">"/highly/sensitive/data/index.html"</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </div>
<?php manual_footer($setup); ?>