<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/security.cgi-bin.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'zh',
  ),
  'this' => 
  array (
    0 => 'security.cgi-bin.attacks.php',
    1 => '可能受到的攻击',
    2 => '可能受到的攻击',
  ),
  'up' => 
  array (
    0 => 'security.cgi-bin.php',
    1 => '以 CGI 模式安装时',
  ),
  'prev' => 
  array (
    0 => 'security.cgi-bin.php',
    1 => '以 CGI 模式安装时',
  ),
  'next' => 
  array (
    0 => 'security.cgi-bin.default.php',
    1 => '情形一：只运行公开的文件',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'zh',
    'path' => 'security/cgi-bin.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="security.cgi-bin.attacks" class="sect1">
    <h2 class="title">可能受到的攻击</h2>
    <p class="simpara">
     如果不想把 PHP 嵌入到服务器端软件（如 Apache）作为一个模块安装的话，可以选择以
     <abbr title="Common Gateway Interface">CGI</abbr> 的模式安装。或者把 PHP 用于不同的 <abbr title="Common Gateway Interface">CGI</abbr>
     封装以便为代码创建安全的 <strong class="command">chroot</strong> 和 <strong class="command">setuid</strong>
     环境。这种安装方式通常会把 <strong class="command">php</strong> 的可执行文件安装到 web 服务器的
     <var class="filename">cgi-bin</var> 目录。CERT 建议书 <a href="http://www.cert.org/advisories/CA-1996-11.html" class="link external">&raquo;&nbsp;CA-96.11</a> 建议不要把任何的解释器放到 <var class="filename">cgi-bin</var> 目录。尽管 <strong class="command">php</strong>
     可以作为一个独立的解释器，但是它的设计使它可以防止下面类型的攻击：
    </p>
    <ul class="itemizedlist">
     <li class="listitem">
      <span class="simpara">
       访问系统文件：<var class="filename">http://my.host/cgi-bin/php?/etc/passwd</var>
      </span>
      <span class="simpara">
       在 URL 请求的问号（<code class="literal">?</code>）后面的信息会传给 CGI
       接口作为命令行的参数。其它的解释器会在命令行中打开并执行第一个参数所指定的文件。
      </span>
      <span class="simpara">
       当作为 CGI 二进制文件调用时，<strong class="command">php</strong> 会拒绝解释命令行参数。
      </span>
     </li>
     <li class="listitem">
      <span class="simpara">
       访问服务器上的任意 Web 文档：<var class="filename">http://my.host/cgi-bin/php/secret/doc.html</var>
      </span>
      <span class="simpara">
       URL 中位于 PHP 二进制名称后面的路径信息 <var class="filename">/secret/doc.html</var>，通常用于指定由 <abbr title="Common Gateway Interface">CGI</abbr> 
       程序打开和解释的文件名。通常一些 web 服务器配置指令（Apache：<code class="literal">Action</code>）用于将 URL
       （如 <var class="filename">http://my.host/secret/script.php</var>）重定向请求到
       PHP 解释器。使用此设置，Web 服务器会先检查目录 <var class="filename">/secret</var>
       的访问权限，然后创建 <var class="filename">http://my.host/cgi-bin/php/secret/script.php</var>
       的重定向请求。不幸的是，如果请求最初是这种形式发出的，那么 Web 服务器不会对文件
       <var class="filename">/secret/script.php</var> 进行任何访问检查，而只会对
       <var class="filename">/cgi-bin/php</var> 进行访问检查。
       这样任何能访问 <var class="filename">/cgi-bin/php</var> 的用户都可以访问
       web 服务器上任何受保护的文档。
      </span>
      <span class="simpara">
       在 PHP 里，运行时配置指令
       <a href="ini.core.php#ini.cgi.force-redirect" class="link">cgi.force_redirect</a>、
       <a href="ini.core.php#ini.doc-root" class="link">doc_root</a> 和
       <a href="ini.core.php#ini.user-dir" class="link">user_dir</a>
       都可以为服务器上的文件和目录添加限制，用于防止这类攻击。下面将对各个选项的设置进行详细讲解。
      </span>
     </li>
    </ul>
   </div><?php manual_footer($setup); ?>