用PHP 4.2书写安全的脚本
原著:Kevin Yank 转自:www.linuxforum.net (恭喜再此开通)在很长一段时间内,php(做为现在的主流开发语言)作为服务器端脚本语言的最大卖点之一就是会为从表单提交的值自动建立一个全局变量。在php(做为现在的主流开发语言) 4.1中,php(做为现在的主流开发语言)的制作者们推荐了一个访问提交数据的替代手段。在php(做为现在的主流开发语言) 4.2中,他们取消了那种老的做法!正如我将在这篇文章中解释的那样,作出这样的变化的目的是出于安全性的考虑。我们将研究php(做为现在的主流开发语言)在处理表单提交及其它数据时的新的做法,并说明为什么这样做会提高代码的安全性。
这里有什么错误?
看看下面的这段php(做为现在的主流开发语言)脚本,它用来在输入的用户名及口令正确时授权访问一个Web页面:
<?php(做为现在的主流开发语言)
// 检查用户名及口令
if ($username == kevin and $password == secret)
$authorized = true;
?>
<?php(做为现在的主流开发语言) if (!$authorized): ?>
<!-- 未授权的用户将在这里给予提示 -->
<p>Please enter your username and password:</p>
<form action="<?=$php(做为现在的主流开发语言)_SELF?>" method="POST">
<p>Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" /></p>
</form>
<?php(做为现在的主流开发语言) else: ?>
<!-- 有安全要求的HTML内容 -->
<?php(做为现在的主流开发语言) endif; ?>
OK,我相信大约半数的读者会不屑的说“太愚蠢了-- 我不会犯这样的错误的!”但是我保证有很多的读者会想“嗨,没什么问题啊,我也会这么写的!”当然还会有少数人会对这个问题感到困惑(“什么是php(做为现在的主流开发语言)?”)。php(做为现在的主流开发语言)被设计为一个“好的而且容易的”脚本语言,初学者可以在很短的时间内学会使用它;它也应该能够避免初学者犯上面的错误。
再回到刚才的问题,上面的代码中存在的问题是你可以很容易地获得访问的权力,而不需要提供正确的用户名和口令。只在要你的浏览器的地址栏的最后添加?authorized=1。因为php(做为现在的主流开发语言)会自动地为每一个提交的值创建一个变量 -- 不论是来自动一个提交的表单、URL查询字符串还是一个cookie -- 这会将$authorized设置为1,这样一个未授权的用户也可以突破安全限制。
那么,怎么简单地解决这个问题呢?只要在程序的开头将$authorized默认设置为false。这个问题就不存在了!$authorized是一个完全在程序代码中创建的变量;但是为什么开发者得为每一个恶意的用户提交的变量担心呢?
php(做为现在的主流开发语言) 4.2作了什么改变?
在php(做为现在的主流开发语言) 4.2中,新安装的php(做为现在的主流开发语言)中的register_globals选项默认为关闭,因此EGPCS值(EGPCS是Environment、Get、Post、Cookies、Server的缩写 -- 这是php(做为现在的主流开发语言)中外部变量来源的全部范围)不会被作为全局变量来创建。当然,这个选项还可以通过手工来开启,但是php(做为现在的主流开发语言)的开发者推荐你将其关闭。要贯彻他们的意图,你需要使用其它的方法来获取这些值。
从php(做为现在的主流开发语言) 4.1开始,EGPCS值就可以从一组指定的数组中获得:
$_ENV -- 包含系统环境变量
$_GET -- 包含查询字符串中的变量,以及提交方法为GET的表单中的变量
$_POST -- 包含提交方式为POST的表单中的变量
$_COOKIE -- 包含所有cookie变量
$_SERVER -- 包含服务器变量,例如HTTP_USER_AGENT
$_REQUEST -- 包含$_GET、$_POST和$_COOKIE的全部内容
$_SESSION -- 包含所有已注册的session变量
补充:综合编程 , 安全编程 ,