mirror of
https://github.com/php/doc-ru.git
synced 2026-03-24 07:42:22 +01:00
231 lines
17 KiB
XML
231 lines
17 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
||
<!-- EN-Revision: 87d3bf2e9ea7da5abbeca3e60ea7cf7abfa6f7f3 Maintainer: shein Status: ready -->
|
||
<!-- Reviewed: no -->
|
||
<chapter xml:id="security.cgi-bin" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||
<title>О безопасности PHP в режиме CGI-программы</title>
|
||
|
||
<sect1 xml:id="security.cgi-bin.attacks">
|
||
<title>Возможные атаки</title>
|
||
<simpara>
|
||
Установка PHP в виде двоичного файла, который взаимодействует с веб-сервером
|
||
по протоколу <acronym>CGI</acronym>, представляет альтернативу
|
||
интегрированию PHP в серверное ПО наподобие веб-сервера Apache в виде модуля
|
||
и альтернативу установкам, которым придётся использовать PHP с набором
|
||
<acronym>CGI</acronym>-обёрток, чтобы сделать окружения для скриптов безопасными
|
||
в части установки утилитами <command>chroot</command> и <command>setuid</command>
|
||
корневого каталога и идентификатора пользователя, от имени которого выполнится скрипт.
|
||
При установке PHP в виде CGI-программы исполняемый двоичный файл <command>php</command>
|
||
часто устанавливают в каталог веб-сервера <filename class="directory">cgi-bin</filename>.
|
||
Компьютерная группа реагирования на чрезвычайные ситуации (англ. Computer Emergency Response Team, CERT)
|
||
подготовила рекомендацию <link xlink:href="&url.cert;">CA-96.11</link>, в которой не советует
|
||
располагать интерпретаторы в каталоге <filename class="directory">cgi-bin</filename>.
|
||
Двоичный файл <command>php</command> спроектировали так, чтобы даже при работе в качестве
|
||
автономного интерпретатора файл защищал от атак, риск которых появляется при установке PHP в режиме CGI:
|
||
</simpara>
|
||
<itemizedlist>
|
||
<listitem>
|
||
<simpara>
|
||
Доступ к системным файлам через запрос вида: <filename
|
||
role="url">http://my.host/cgi-bin/php?/etc/passwd</filename>.
|
||
</simpara>
|
||
<simpara>
|
||
Информация в query-компоненте, который URL-адрес запроса содержит
|
||
после вопросительного знака (<literal>?</literal>), передаётся
|
||
интерпретатору через CGI-интерфейс как аргументы командной строки.
|
||
Стандартное поведение интерпретатора — открыть и исполнить в командной строке файл,
|
||
который указали как первый аргумент запроса.
|
||
</simpara>
|
||
<simpara>
|
||
В режиме CGI-обработчика <command>php</command> не станет
|
||
интерпретировать аргументы командной строки.
|
||
</simpara>
|
||
</listitem>
|
||
<listitem>
|
||
<simpara>
|
||
Доступ к произвольному документу на сервере:
|
||
<filename
|
||
role="url">http://my.host/cgi-bin/php/secret/doc.html</filename>.
|
||
</simpara>
|
||
<simpara>
|
||
Информация в path-части URL-адреса наподобие <filename role="uri">/secret/doc.html</filename>,
|
||
которая идёт после названия двоичного файла PHP, указывает название файла,
|
||
который <acronym>CGI</acronym>-программа откроет и интерпретирует.
|
||
Отдельные директивы конфигурации наподобие директивы <literal>Action</literal>
|
||
в конфигурации веб-сервера Apache указывают, чтобы перенаправить запрос к документам вида
|
||
<filename role="url">http://my.host/secret/script.php</filename> к интерпретатору PHP.
|
||
При такой настройке веб-сервер сначала проверяет права доступа к каталогу
|
||
<filename role="uri">/secret</filename>, а затем создаёт и перенаправляет запрос к файлу
|
||
<filename role="url">http://my.host/cgi-bin/php/secret/script.php</filename>.
|
||
К сожалению, веб-сервер проверит права доступа только к файлу <filename role="uri">/cgi-bin/php</filename>,
|
||
но не проверит права доступа к файлу <filename role="uri">/secret/script.php</filename>,
|
||
если запрос в самом начале задали в полной форме. Поэтому пользователи с доступом
|
||
к файлу <filename role="uri">/cgi-bin/php</filename> получат доступ к защищённым документам на сервере.
|
||
</simpara>
|
||
<simpara>
|
||
Для предотвращения атак, которые направляют на каталоги с ограничениями доступа,
|
||
если такие содержит дерево документов сервера, в PHP пользуются директивами конфигурации
|
||
<link linkend="ini.cgi.force-redirect">cgi.force_redirect</link>,
|
||
<link linkend="ini.doc-root">doc_root</link>
|
||
и <link linkend="ini.user-dir">user_dir</link>, которые PHP учитывает при выполнении кода.
|
||
Подробнее опции и их комбинации рассматривают следующие главы раздела.
|
||
</simpara>
|
||
</listitem>
|
||
</itemizedlist>
|
||
</sect1>
|
||
|
||
<sect1 xml:id="security.cgi-bin.default">
|
||
<title>Вариант 1: обслуживание только общедоступных файлов</title>
|
||
|
||
<simpara>
|
||
Опциями, которые упоминает предыдущая глава раздела, не пользуются,
|
||
если на сервере нет файлов, доступ к которым ограничили паролем или фильтром по IP-адресам.
|
||
В ситуации, при которой веб-сервер не разрешает выполнять перенаправления
|
||
или у сервера нет способа сообщить исполняемому PHP-файлу
|
||
о безопасном перенаправлении запроса,
|
||
включают ini-директиву <link linkend="ini.cgi.force-redirect">cgi.force_redirect</link>.
|
||
Но при этом по-прежнему требуется убедиться, что альтернативные способы
|
||
вызова скрипта наподобие непосредственного
|
||
вызова файла <filename role="php">http://my.host/cgi-bin/php/dir/script.php</filename>
|
||
или вызова с переадресацией к файлу <filename role="php">http://my.host/dir/script.php</filename>
|
||
недоступны.
|
||
</simpara>
|
||
<simpara>
|
||
На веб-сервере Apache перенаправление конфигурируют
|
||
через директивы <literal>AddHandler</literal> и <literal>Action</literal>,
|
||
которые описывает следующая глава раздела.
|
||
</simpara>
|
||
</sect1>
|
||
|
||
<sect1 xml:id="security.cgi-bin.force-redirect">
|
||
<title>Вариант 2: включение директивы <literal>cgi.force_redirect</literal></title>
|
||
<simpara>
|
||
Конфигурационная директива <link linkend="ini.cgi.force-redirect">cgi.force_redirect</link>
|
||
запрещает прямой вызов <command>php</command> по URL-адресу, похожему
|
||
на <filename role="php">http://my.host/cgi-bin/php/secretdir/script.php</filename>.
|
||
В этом режиме вместо прямого вызова PHP разберёт поступивший запрос,
|
||
только если запрос перенаправил веб-сервер.
|
||
</simpara>
|
||
<simpara>
|
||
Перенаправление в конфигурации Apache чаще настраивают
|
||
через следующие директивы:
|
||
</simpara>
|
||
<programlisting role="apache-conf">
|
||
<![CDATA[
|
||
Action php-script /cgi-bin/php
|
||
AddHandler php-script .php
|
||
]]>
|
||
</programlisting>
|
||
<simpara>
|
||
Опцию конфигурации протестировали только с веб-сервером Apache/
|
||
При установке нестандартной переменной CGI-окружения <envar>REDIRECT_STATUS</envar>
|
||
для перенаправленных запросов опция полагается на веб-сервер Apache.
|
||
Нельзя пользоваться этой опцией конфигурации, если веб-сервер не поддерживает
|
||
способы определения прямых и перенаправленных запросов, и лучше запускать CGI-версии PHP
|
||
другими способами, которые описывает раздел.
|
||
</simpara>
|
||
</sect1>
|
||
|
||
<sect1 xml:id="security.cgi-bin.doc-root">
|
||
<title>Вариант 3: включение директив doc_root или user_dir</title>
|
||
<simpara>
|
||
Включение в каталоги документов веб-сервера активного содержимого
|
||
наподобие скриптов и исполняемых файлов ослабляет безопасность.
|
||
Из-за ошибок в конфигурации сервера, когда скрипты не выполняются, а отображаются
|
||
в браузере как HTML-документы, утекает интеллектуальная собственность
|
||
или конфиденциальная информация наподобие паролей.
|
||
Поэтому системные администраторы отдают преимущество настройке другой структуры
|
||
каталогов хранения скриптов, к которым открывают доступ только через CGI-интерфейс PHP,
|
||
который гарантирует интерпретацию, а не вывод кода скриптов.
|
||
</simpara>
|
||
<simpara>
|
||
Потребуется установить через директиву <link linkend="ini.doc-root">doc_root</link>
|
||
корневой каталог, который отличается от корневого каталога веб-документов,
|
||
если метод, который проверяет запросы на перенаправление, как описывает предыдущая глава,
|
||
недоступен.
|
||
</simpara>
|
||
<simpara>
|
||
Корневой каталог для PHP-скриптов устанавливают
|
||
<link linkend="configuration.file">в файле конфигурации PHP</link>
|
||
через директиву <link linkend="ini.doc-root">doc_root</link>
|
||
или через переменную окружения <envar>PHP_DOCUMENT_ROOT</envar>.
|
||
При установке корневого каталога для PHP-скриптов <acronym>CGI</acronym>-версия
|
||
двоичного файла PHP сформирует путь к файлу, который требуется открыть,
|
||
на основе значения директивы <parameter>doc_root</parameter> и пути,
|
||
который указали в запросе. Это гарантирует, что скрипты за пределами
|
||
этого каталога, за исключением каталога <parameter>user_dir</parameter>,
|
||
не выполнятся.
|
||
</simpara>
|
||
<simpara>
|
||
Другая директива, которая помогает создавать безопасные пути к файлам, —
|
||
<link linkend="ini.user-dir">user_dir</link>. Путём к файлу, который требуется открыть,
|
||
управляет только директива <parameter>doc_root</parameter>, если директиву
|
||
<parameter>user_dir</parameter> не установили. При запросе URL-адреса наподобие
|
||
<filename role="url">http://my.host/~user/doc.php</filename> обработчик откроет файл
|
||
с названием <filename role="uri">~user/doc.php</filename> (да, название каталога
|
||
начинается с символа <literal>~</literal>) в каталоге, который установили в директиве
|
||
<parameter>doc_root</parameter>, а не файл в домашнем каталоге пользователей.
|
||
</simpara>
|
||
<simpara>
|
||
Но если для директивы <parameter>user_dir</parameter> установили значение наподобие
|
||
<filename role="dir">public_php</filename>, то запрос URL-адреса
|
||
<filename role="url">http://my.host/~user/doc.php</filename>
|
||
откроет файл <filename>doc.php</filename>, который лежит
|
||
в домашнем каталоге пользователя в директории <filename role="dir">public_php</filename>.
|
||
Приведём пример. Обработчик выполнит файл <filename>/home/user/public_php/doc.php</filename>,
|
||
если домашний каталог пользователя <filename role="dir">/home/user</filename>.
|
||
</simpara>
|
||
<simpara>
|
||
PHP разворачивает значение директивы <parameter>user_dir</parameter>
|
||
независимо от настройки директивы <parameter>doc_root</parameter>,
|
||
поэтому управлять корневым каталогом документов веб-сервера
|
||
и каталогом пользователя разрешается по отдельности.
|
||
</simpara>
|
||
</sect1>
|
||
|
||
<sect1 xml:id="security.cgi-bin.shell">
|
||
<title>Вариант 4: PHP вне дерева веб-документов</title>
|
||
<para>
|
||
Безопасность значительно повышается за счёт переноса двоичного файла PHP-парсера
|
||
за пределы дерева веб-файлов, в каталог наподобие <filename role="dir">/usr/local/bin</filename>.
|
||
Единственный недостаток такого способа
|
||
состоит в том, в первую строку каждого файла с PHP-тегами придётся вставить аргумент:
|
||
<informalexample>
|
||
<programlisting>
|
||
<![CDATA[
|
||
#!/usr/local/bin/php
|
||
]]>
|
||
</programlisting>
|
||
</informalexample>
|
||
Аналогично другим CGI-скриптам, которые написали на языке Perl, sh или другом скриптовом
|
||
языке общего назначения, который использует символы <literal>#!</literal> — механизм shell-экранирования
|
||
для запуска самого себя, потребуется сделать каждый файл скрипта исполняемым.
|
||
</para>
|
||
<para>
|
||
Для корректной обработки PHP-интерпретатором переменных окружения
|
||
<envar>PATH_INFO</envar> и <envar>PATH_TRANSLATED</envar>
|
||
потребуется включить ini-директиву <link linkend="ini.cgi.discard-path">cgi.discard_path</link>.
|
||
</para>
|
||
</sect1>
|
||
|
||
</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
|
||
-->
|