如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
安全技巧:用PHP4.2书写安全的脚本在很长一段时间内,PHP作为服务器端脚本语言的最大卖点之一就是会为从表单提交的值自动建立一个全局变量。在PHP4.1中,PHP的制作者们推荐了一个访问提交数据的替代手段。在PHP4.2中,他们取消了那种老的做法!正如我将在这篇文章中解释的那样,作出这样的变化的目的是出于安全性的考虑。我们将研究PHP在处理表单提交及其它数据时的新的做法,并说明为什么这样做会提高代码的安全性。这里有什么错误?看看下面的这段PHP脚本,它用来在输入的用户名及口令正确时授权访问一个Web页面:<?php//检查用户名及口令if($username=='kevin'and$password=='secret')$authorized=true;?><?phpif(!$authorized):?><!--未授权的用户将在这里给予提示--><p>Pleaseenteryourusernameandpassword:</p><formaction="<?=$PHP_SELF?>"method="POST"><p>Username:<inputtype="text"name="username"/><br/>Password:<inputtype="password"name="password"/><br/><inputtype="submit"/></p></form><?phpelse:?><!--有安全要求的HTML内容--><?phpendif;?>OK,我相信大约半数的读者会不屑的说“太愚蠢了--我不会犯这样的错误的!”但是我保证有很多的读者会想“嗨,没什么问题啊,我也会这么写的!”当然还会有少数人会对这个问题感到困惑(“什么是PHP?”)。PHP被设计为一个“好的而且容易的”脚本语言,初学者可以在很短的时间内学会使用它;它也应该能够避免初学者犯上面的错误。再回到刚才的问题,上面的代码中存在的问题是你可以很容易地获得访问的权力,而不需要提供正确的用户名和口令。只在要你的浏览器的地址栏的最后添加?authorized=1。因为PHP会自动地为每一个提交的值创建一个变量--不论是来自动一个提交的表单、URL查询字符串还是一个cookie--这会将$authorized设置为1,这样一个未授权的用户也可以突破安全限制。那么,怎么简单地解决这个问题呢?只要在程序的开头将$authorized默认设置为false。这个问题就不存在了!$authorized是一个完全在程序代码中创建的变量;但是为什么开发者得为每一个恶意的用户提交的变量担心呢?PHP4.2作了什么改变?在PHP4.2中,新安装的PHP中的register_globals选项默认为关闭,因此EGPCS值(EGPCS是Environment、Get、Post、Cookies、Server的缩写--这是PHP中外部变量来源的全部范围)不会被作为全局变量来创建。okooo澳客网e505.org当然,这个选项还可以通过手工来开启,但是PHP的开发者推荐你将其关闭。要贯彻他们的意图,你需要使用其它的方法来获取这些值。从PHP4.1开始,EGPCS值就可以从一组指定的数组中获得:$_ENV--包含系统环境变量$_GET--包含查询字符串中的变量,以及提交方法为GET的表单中的变量$_POST--包含提交方式为POST的表单中的变量$_COOKIE--包含所有cookie变量$_SERVER--包含服务器变量,例如HTTP_USER_AGENT$_REQUEST--包含$_GET、$_POST和$_COOKIE的全部内容$_SESSION--包含所有已注册的session变量在PHP4.1之前,当开发者关闭register_globals选项(这也被考虑为提高PHP性能的一种方法)后,必须使用诸如$HTTP_GET_VARS这样的令人讨厌的名字来获取这些变量。这些新的变量名不仅仅短,而且它们还有其他优点。首先,让我们在PHP4.2中(也就是说关闭register_globals选项)重写上面提到的代码:<?php$username=$_REQUEST['username'];$password=$_REQUEST['password'];//检查用户名和口令if($username=='kevin'and$password=='secret')$authorized=true;?><?phpif(!$authorized):?><!--未授权的用户将在这里给予提示--><p>Pleaseenteryourusernameandpassword:</p><formaction="<?=$PHP_SELF?>"method="POST"><p>Username: