之所以翻译这篇文章,是因为目前关于 CGI 安全性的文章都是拿 Perl 作为例子,而专门
介绍 ASP,php 或者 jsp 安全性的文章则很少。Shaun Clowes 的这篇文章比较全面地介绍了
PHP 的安全问题,原文可以在 http://www.securereality.com.au/stu...arlet.txt
找到。
由于原文比较长,而且有相当一部分是介绍文章的背景或 PHP 的基础知识,没有涉及到
PHP
安全方面的内容,因此我没有翻译。如果你想了解这方面的知识,请参考原文。
文章主要从全局变量,远程文件,文件上载,库文件,session 文件,数据类型和容易出
错的函数这几个方面分析了 PHP 的安全性,并且对如何增强 PHP 的安全性提出了一些有
用的建议。
好了,废话少说,我们言归正传!
[全局变量]
PHP 中的变量不需要事先声明,它们会在第一次使用时自动创建,它们的类型也不需要
指定,它们会根据上下文环境自动确定。从程序员的角度来看,这无疑是一种极其方便的
处理方法。很显然,这也是快速开发语言的一个很有用的特点。一旦一个变量被创建了,
就可以在程序中的任何地方使用。这个特点导致的结果就是程序员很少初始化变量,毕竟,
当它们第一次创建时,他们是空的。
很显然,基于 PHP 的应用程序的主函数一般都是接受用户的输入(主要是表单变量,上
载文件和 Cookie 等),然后对输入数据进行处理,然后把结果返回到客户端浏览器。为
了使 PHP 代码访问用户的输入尽可能容易,实际上 PHP 是把这些输入数据看作全局变量
来处理的。
例如:
<FORM METHOD="GET" ACTION="test.php">
<INPUT TYPE="TEXT" NAME="hello">
<INPUT TYPE="SUBMIT">
</FORM>
“
很显然,这会显示一个文本框和提交按钮。当用户点击提交按钮时, test.php”会处理用户
“
的输入,当 test.php”
“
运行时, $hello”会包含用户在文本框输入的数据。从这里我们应该
看出,攻击者可以按照自己的意愿创建任意的全局变量。如果攻击者不是通过表单输入来
“
调用 test.php”,而是直接在浏览器地址栏输入 http://server/test.php?hello=hi&set...敲矗
恢故恰?/a>$hello”
“
被创建, $setup”
也被创建了。
“
译者注:这两种方法也就是我们通常说的 POST” “
和 GET”
方法。
下面的用户认证代码暴露了 PHP
的全局变量所导致的安全问题:
<?php
if ($pass == "hello")
$auth = 1;