用PHP书写安全的脚本代码
前端之家收集整理的这篇文章主要介绍了
用PHP书写安全的脚本代码,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在PHP 4.2中,他们取消了那种老的做法!正如我将在这篇文章中解释的那样,作出这样的变化的目的是出于安全性的考虑。我们将研究PHP在处理表单提交及其它数据时的新的做法,并说明为什么这样做会提高代码的安全性。 这里有什么错误? 看看下面的这段PHP脚本,它用来在输入的用户名及口令正确时授权访问一个Web页面:
<div class="codetitle"><a style="CURSOR: pointer" data="93046" class="copybut" id="copybut93046" onclick="doCopy('code93046')"> 代码如下:
<div class="codebody" id="code93046">
<?
PHP // 检查
用户名及口令
if ($username == 'kevin' and $password == 'secret')
$authorized = true;
?>
<?php if (!$authorized): ?>
Please enter your username and password:
<form action="<?=$PHP_SELF?>" method="POST">
Username:
Password:
<?php else: ?>
<?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变量
在
PHP 4.1之前,当开发者
关闭register_globals选项(这也被考虑为提高
PHP性能的一种
方法)后,必须使用诸如$HTTP_GET_VARS这样的令人讨厌的名字来
获取这些变量。这些新的变量名不仅仅短,而且它们还有其他优点。
首先,让我们在
PHP 4.2中(也就是说
关闭register_globals 选项)重写上面提到的
代码:
<div class="codetitle">
<a style="CURSOR: pointer" data="84760" class="copybut" id="copybut84760" onclick="doCopy('code84760')"> 代码如下: