可能受到的攻击

如果不想把 PHP 嵌入到服务器端软件(如 Apache)作为一个模块安装的话,可以选择以 CGI 的模式安装。或者把 PHP 用于不同的 CGI 封装以便为代码创建安全的 chrootsetuid 环境。这种安装方式通常会把 php 的可执行文件安装到 web 服务器的 cgi-bin 目录。CERT 建议书 » CA-96.11 建议不要把任何的解释器放到 cgi-bin 目录。尽管 php 可以作为一个独立的解释器,但是它的设计使它可以防止下面类型的攻击:

  • 访问系统文件:http://my.host/cgi-bin/php?/etc/passwd 在 URL 请求的问号(?)后面的信息会传给 CGI 接口作为命名行的参数。其它的解释器会在命令行中打开并执行第一个参数所指定的文件。 当作为 CGI 二进制文件调用时,php 会拒绝解释命令行参数。
  • 访问服务器上的任意 Web 文档:http://my.host/cgi-bin/php/secret/doc.html URL 中位于 PHP 二进制名称后面的路径信息 /secret/doc.html,通常用于指定由 CGI 程序打开和解释的文件名。通常一些 web 服务器配置指令(Apache:Action)用于将 URL (如 http://my.host/secret/script.php)重定向请求到 PHP 解释器。使用此设置,Web 服务器会先检查目录 /secret 的访问权限,然后创建 http://my.host/cgi-bin/php/secret/script.php 的重定向请求。不幸的是,如果请求最初是这种形式发出的,那么 Web 服务器不会对文件 /secret/script.php 进行任何访问检查,而只会对 /cgi-bin/php 进行访问检查。 这样任何能访问 /cgi-bin/php 的用户都可以访问 web 服务器上任何受保护的文档。 在 PHP 里,运行时配置指令 cgi.force_redirectdoc_rootuser_dir 都可以为服务器上的文件和目录添加限制,用于防止这类攻击。下面将对各个选项的设置进行详细讲解。