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/cgi-bin.xml
Sergey Panteleev daef8df962 Обнуление тега Reviewed (#364)
[skip-lint]
[skip-spellcheck]
2021-11-16 13:03:53 +03:00

244 lines
16 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: 6a5b42e0d34c76890fd96be2b0b57516363b4c8a 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) в качестве модуля,
либо предполагается использование различных <acronym>CGI</acronym>-обёрток
и таких утилит, как chroot и setuid для организации безопасного
окружения работы скриптов.
Такая установка обычно сопровождается копированием исполняемого
файла PHP в директорию cgi-bin веб-сервера. CERT (организация,
следящая за угрозами безопасности)
<link xlink:href="&url.cert;">CA-96.11</link> рекомендует не помещать
какие-либо интерпретаторы в каталог cgi-bin. Даже если PHP используется
как самостоятельный интерпретатор, он спроектирован так, чтобы предотвратить
возможность следующих атак:
</simpara>
<itemizedlist>
<listitem>
<simpara>
Доступ к системным файлам: <filename
role="url">http://my.host/cgi-bin/php?/etc/passwd</filename>
</simpara>
<simpara>
Данные, введённые в строке запроса (URL) после вопросительного знака,
передаются интерпретатору как аргументы командной строки с помощью
интерфейса CGI. Обычно интерпретаторы открывают
и исполняют файл, указанный в качестве первого аргумента.
</simpara>
<simpara>
В случае использования PHP в качестве CGI-приложения он не
станет интерпретировать аргументы командной строки.
</simpara>
</listitem>
<listitem>
<simpara>
Доступ к произвольному документу на сервере:
<filename
role="url">http://my.host/cgi-bin/php/secret/doc.html</filename>
</simpara>
<simpara>
Согласно общепринятому соглашению, часть пути в запрошенной
странице, которая расположена после имени выполняемого модуля
PHP, <filename role="uri">/secret/doc.html</filename>,
используется для указания файла, который будет интерпретирован
<acronym>CGI</acronym>-программой. Обычно, некоторые конфигурационные
опции веб-сервера (например, Action для сервера 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">/secret/script.php</filename> не выполняется, она
происходит только для файла <filename role="uri">/cgi-bin/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>, то можно предотвратить
подобные атаки для директорий с ограниченным доступом.
Более детально приведённые опции, а также их комбинации будут рассмотрены ниже.
</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 перенаправление может быть сконфигурировано
при помощи директив AddHandler и Action (описано ниже).
</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>
предотвращает попытки непосредственного вызова PHP по адресу
вида <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, её работа основывается
на установке в случае перенаправления нестандартной переменной
<envar>REDIRECT_STATUS</envar>, находящейся в CGI-окружении.
В случае, если ваш веб-сервер не предоставляет возможности
однозначно идентифицировать, является ли данный запрос
перенаправленным, вы не можете использовать описываемую в
данном разделе опцию и должны воспользоваться любым другим
методом работы с CGI-приложениями.
</simpara>
</sect1>
<sect1 xml:id="security.cgi-bin.doc-root">
<title>Вариант 3: использование опций doc_root или user_dir</title>
<simpara>
Размещение динамического контента, такого как скрипты или любых
других исполняемых файлов, в директории веб-сервера делает его
потенциально опасным. В случае, если в конфигурации сервера допущена
ошибка, возможна ситуация, когда скрипты не выполняются, а отображаются
в браузере, как обычные HTML-документы, что может привести к утечке конфиденциальной
информации (например, паролей), либо информации, являющейся
интеллектуальной собственностью. Исходя из таких соображений, многие
системные администраторы предпочитают использовать для хранения скриптов
отдельную директорию, работая со всеми размещёнными в ней файлами
по CGI-интерфейсу.
</simpara>
<simpara>
В случае, если невозможно гарантировать, что запросы не перенаправляются,
как было показано в предыдущем разделе, необходимо указывать
переменную doc_root, которая отличается от корневой директории веб-документов.
</simpara>
<simpara>
Вы можете установить корневую директорию для PHP-скриптов, настроив
параметр <link linkend="ini.doc-root">doc_root</link> в
<link linkend="configuration.file">конфигурационном файле</link>,
либо установив переменную окружения <envar>PHP_DOCUMENT_ROOT</envar>.
В случае, если PHP используется посредством <acronym>CGI</acronym>,
полный путь к открываемому файлу будет построен на основании
значения переменной <parameter>doc_root</parameter> и указанного
в запросе пути. Таким образом, вы можете быть уверены,
что скрипты будут выполняться только внутри указанной вами директории
(кроме директории <parameter>user_dir</parameter>, которая описана ниже).
</simpara>
<simpara>
Ещё одна используемая при настройке безопасности опция -
<link linkend="ini.user-dir">user_dir</link>. В случае, если
переменная user_dir не установлена, путь к открываемому файлу
строится относительно <parameter>doc_root</parameter>. Запрос
вида <filename role="url">http://my.host/~user/doc.php</filename>
приводит к выполнению скрипта, находящегося не в домашнем каталоге
соответствующего пользователя, а находящегося в подкаталоге doc_root
скрипта <filename role="uri">~user/doc.php</filename> (да, имя
директории начинается с символа <literal>~</literal>).
</simpara>
<simpara>
Но если user_dir установлена, например, в значение
<filename role="dir">public_php</filename>, то запрос вида
<filename role="url">http://my.host/~user/doc.php</filename>
откроет файл <filename>doc.php</filename>, находящийся в
домашнем каталоге пользователя, в директории <filename role="dir">public_php</filename>.
Например, если домашний каталог пользователя <filename role="dir">/home/user</filename>,
будет выполнен файл <filename>/home/user/public_php/doc.php</filename>.
</simpara>
<simpara>
Установка опции <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>. Единственным недостатком такого подхода
является то, что первая строка каждого скрипта должна иметь вид:
<informalexample>
<programlisting>
<![CDATA[
#!/usr/local/bin/php
]]>
</programlisting>
</informalexample>
Также необходимо сделать все файлы скриптов исполняемыми. Таким образом,
скрипт будет рассматриваться так же, как и любое другое CGI-приложение,
написанное на Perl, sh или любом другом скриптовом языке, который использует
<literal>#!</literal> в начале файла для запуска самого себя.
</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
-->