<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML ><HEAD ><TITLE >以 CGI 模式安装时</TITLE ><META NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK REL="HOME" TITLE="PHP 手册" HREF="index.html"><LINK REL="UP" TITLE="安全" HREF="security.html"><LINK REL="PREVIOUS" TITLE="总则" HREF="security.general.html"><LINK REL="NEXT" TITLE="情形一:只运行公开的文件" HREF="security.cgi-bin.default.html"><META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=UTF-8"></HEAD ><BODY CLASS="chapter" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#0000FF" VLINK="#840084" ALINK="#0000FF" ><DIV CLASS="NAVHEADER" ><TABLE SUMMARY="Header navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TH COLSPAN="3" ALIGN="center" >PHP 手册</TH ></TR ><TR ><TD WIDTH="10%" ALIGN="left" VALIGN="bottom" ><A HREF="security.general.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="80%" ALIGN="center" VALIGN="bottom" ></TD ><TD WIDTH="10%" ALIGN="right" VALIGN="bottom" ><A HREF="security.cgi-bin.default.html" ACCESSKEY="N" >下一页</A ></TD ></TR ></TABLE ><HR ALIGN="LEFT" WIDTH="100%"></DIV ><DIV CLASS="chapter" ><H1 ><A NAME="security.cgi-bin" >章 24. 以 CGI 模式安装时</A ></H1 ><DIV CLASS="TOC" ><DL ><DT ><B >目录</B ></DT ><DT ><A HREF="security.cgi-bin.html#security.cgi-bin.attacks" >可能受到的攻击</A ></DT ><DT ><A HREF="security.cgi-bin.default.html" >情形一:只运行公开的文件</A ></DT ><DT ><A HREF="security.cgi-bin.force-redirect.html" >情形二:使用 --enable-force-cgi-redirect 选项</A ></DT ><DT ><A HREF="security.cgi-bin.doc-root.html" >情形三:设置 doc_root 或 user_dir</A ></DT ><DT ><A HREF="security.cgi-bin.shell.html" >情形四:PHP 解释器放在 web 目录以外</A ></DT ></DL ></DIV ><DIV CLASS="sect1" ><H1 CLASS="sect1" ><A NAME="security.cgi-bin.attacks" >可能受到的攻击</A ></H1 ><P > 如果不想把 PHP 嵌入到服务器端软件(如 Apache)作为一个模块安装的话,可以选择以 <ACRONYM CLASS="acronym" >CGI</ACRONYM > 的模式安装。或者把 PHP 用于不同的 CGI 封装以便为代码创建安全的 chroot 和 setuid 环境。这种安装方式通常会把 PHP 的可执行文件安装到 web 服务器的 cgi-bin 目录。CERT 建议书 <A HREF="http://www.cert.org/advisories/CA-1996-11.html" TARGET="_top" >CA-96.11</A > 建议不要把任何的解释器放到 cgi-bin 目录。尽管 PHP 可以作为一个独立的解释器,但是它的设计使它可以防止下面类型的攻击: </P ><P ></P ><UL ><LI ><P > 访问系统文件:<TT CLASS="filename" >http://my.host/cgi-bin/php?/etc/passwd</TT > </P ><P > 在 URL 请求的问号(?)后面的信息会传给 CGI 接口作为命名行的参数。其它的解释器会在命令行中打开并执行第一个参数所指定的文件。 </P ><P > 但是,以 CGI 模式安装的 PHP 解释器被调用时,它会拒绝解释这些参数。 </P ></LI ><LI ><P > 访问服务器上的任意目录:<TT CLASS="filename" >http://my.host/cgi-bin/php/secret/doc.html</TT > </P ><P > 好像上面这种情况,PHP 解释器所在目录后面的 URL 信息 <TT CLASS="filename" >/secret/doc.html</TT > 将会例行地传给 <ACRONYM CLASS="acronym" >CGI</ACRONYM > 程序并进行解释。通常一些 web 服务器的会将它重定向到页面,如 <TT CLASS="filename" >http://my.host/secret/script.php</TT >。如果是这样的话,某些服务器会先检查用户访问 <TT CLASS="filename" >/secret</TT > 目录的权限,然后才会创建 <TT CLASS="filename" >http://my.host/cgi-bin/php/secret/script.php</TT > 上的页面重定向。不幸的是,很多服务器并没有检查用户访问 /secret/script.php 的权限,只检查了 <TT CLASS="filename" >/cgi-bin/php</TT > 的权限,这样任何能访问 <TT CLASS="filename" >/cgi-bin/php</TT > 的用户就可以访问 web 目录下的任意文件了。 </P ><P > 在 PHP 里,编译时配置选项 <A HREF="configure.html#configure.enable-force-cgi-redirect" >--enable-force-cgi-redirect</A > 以及运行时配置指令 <A HREF="ini.core.html#ini.doc-root" >doc_root</A > 和 <A HREF="ini.core.html#ini.user-dir" >user_dir</A > 都可以为服务器上的文件和目录添加限制,用于防止这类攻击。下面将对各个选项的设置进行详细讲解。 </P ></LI ></UL ></DIV ></DIV ><DIV CLASS="NAVFOOTER" ><HR ALIGN="LEFT" WIDTH="100%"><TABLE SUMMARY="Footer navigation table" WIDTH="100%" BORDER="0" CELLPADDING="0" CELLSPACING="0" ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" ><A HREF="security.general.html" ACCESSKEY="P" >上一页</A ></TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="index.html" ACCESSKEY="H" >起始页</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" ><A HREF="security.cgi-bin.default.html" ACCESSKEY="N" >下一页</A ></TD ></TR ><TR ><TD WIDTH="33%" ALIGN="left" VALIGN="top" >总则</TD ><TD WIDTH="34%" ALIGN="center" VALIGN="top" ><A HREF="security.html" ACCESSKEY="U" >上一级</A ></TD ><TD WIDTH="33%" ALIGN="right" VALIGN="top" >情形一:只运行公开的文件</TD ></TR ></TABLE ></DIV ></BODY ></HTML >