PHP新手上路(七)


Posted in PHP onOctober 09, 2006

建设一个简单交互的网站(三)

6. 密码验证

也许你想在自己的网站放上你的照片集,而且只想给自己知心的朋友看,这时你需要一个密码验证的程序。

6.1 基于HTTP验证

如何用PHP来实现密码验证的功能呢?我们可以使用简短的PHP代码,使用函数header()发送HTTP标头强制验证,客户端浏览器则弹出供输入用户名和密码的对话框。在PHP中,客户端用户输入的信息传送到服务端之后自动保存在$PHP_AUTH_USER, $PHP_AUTH_PW, 以及 $PHP_AUTH_TYPE这三个全局变量中。利用这些变量,我们就可以根据实现保存在数据文件或数据库中的用户帐号信息验证用户身份。

不过在这里需要提醒使用者注意的一点是:只有在Apache模块方式运行的时候,PHP脚本才能使用$PHP_AUTH_USER, $PHP_AUTH_PW, 以及 $PHP_AUTH_TYPE这三个变量。如果用户使用的是CGI模式的PHP则无法实现基于HTTP的验证功能。  

6.2 下面,我们就来详细介绍一下如何使用PHP对用户身份进行验证。

在下例中,我们是使用$PHP_AUTH_USER和$PHP_AUTH_PW这两个变量来验证进入者是否合法并允许进入。在本例中被允许登录的用户名称和密码对分别为tnc和nature:
<?
if(!isset($PHP_AUTH_USER))  
{
Header("WWW-Authenticate: Basic realm="My Realm"");
Header("HTTP/1.0 401 Unauthorized");
echo "Text to send if user hits Cancel buttonn";
exit;
}  
else  
{
if ( !($PHP_AUTH_USER=="tnc" && $PHP_AUTH_PW=="nature") )
{
// 如果是错误的用户名称/密码对,强制再验证
Header("WWW-Authenticate: Basic realm="My Realm"");
Header("HTTP/1.0 401 Unauthorized");
echo "ERROR : $PHP_AUTH_USER/$PHP_AUTH_PW is invalid.";
exit;
}  
else  
{
echo "Welcome tnc!";
}
?>

事实上再实际引用中不大可能如上面使用代码段明显的用户名称/密码对,而是利用数据库或者加密的密码文件存取它们。  

6.3 根据指定的验证信息核实用户身份

首先,我们可以使用以下代码确定用户是否已经输入了用户名和密码,并显示出用户输入的信息。

<?php  

if (!isset($PHP_AUTH_USER)) {

header('WWW-Authenticate: Basic realm="My Private Stuff"');

header('HTTP/1.0 401 Unauthorized');

echo 'Authorization Required.';

exit;

}

else {

echo "<P>You have entered this username: $PHP_AUTH_USER<br>

You have entered this password: $PHP_AUTH_PW<br>

The authorization type is: $PHP_AUTH_TYPE</p>";

}

?>

说明:
isset()函数用于确定某个变量是否已被赋值。根据变量值是否存在,返回true或false。
header()函数用于发送特定的HTTP标头。注意,使用header()函数时,一定要在任何产生实际输出的HTML或PHP代码前面调用该函数。

虽然上述代码相当简单,没有根据任何实际值对用户输入的用户名和密码进行有效验证,但是至少我们了解了如何使用PHP在客户端产生输入对话框。

下面,我们就来了解一下如何根据指定的验证信息核实用户身份。代码如下:

<?php

if (!isset($PHP_AUTH_USER)) {

header('WWW-Authenticate: Basic realm="My Private Stuff"');

header('HTTP/1.0 401 Unauthorized');

echo 'Authorization Required.';

exit;

}

else if (isset($PHP_AUTH_USER)) {

if (($PHP_AUTH_USER != "admin") || ($PHP_AUTH_PW != "123")) {

header('WWW-Authenticate: Basic realm="My Private Stuff"');

header('HTTP/1.0 401 Unauthorized');

echo 'Authorization Required.';

exit;

} else {

echo "<P>You're authorized!</p>";

}

}

?>

在这里,我们首先检查用户是否已经输入了用户名称和密码,如果没有则弹出相应对话框要求用户输入身份信息。随后,我们通过判断用户输入的信息是否符合admin/123这一指定用户帐号来授予用户访问权限或提示用户再次输入正确的信息。这种方法适用于所有用户都使用同一登录帐号的网站。  

6.4 另一种简易的密码验证

如果你是在windows98下面编写和运行着你的PHP脚本,或者是你在Linux下面按默认设置,将PHP安装成一个CGI程序的话,你将无法使用上面的PHP程序来实现验证功能。为此,无边给大家提供了另外一种简易的密码验证的方法。虽然实用性不大,但是拿来学习还是挺好的。
<?php
$password = "123";  

// check password
if($pass != $password)
{
echo "<html><head><title>管理密码</title></head><body>";
echo "<form method="post" action=$PHP_SELF>";
echo "请输入你的管理密码:<br>";
echo "<input type="password" name="pass">";
echo "<input type="submit" value="continue">";
echo "</form></body></html>";
}
else
{
echo "<html><head><title>恭喜你,你已经通过了密码验证</title></head>";
echo "<script>";
echo 'window.location="http://gophp.heha.net/test/index.php3"';
# 通过密码验证后转入的页面
echo "</script>";

}
?>    

PHP 相关文章推荐
落伍首发 php+mysql 采用ajax技术的 省 市 地 3级联动无刷新菜单 源码
Dec 16 PHP
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
May 26 PHP
php UTF8 文件的签名问题
Oct 30 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
May 25 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
Jul 15 PHP
ThinkPHP查询语句与关联查询用法实例
Nov 01 PHP
yii的CURD操作实例详解
Dec 04 PHP
通过php修改xml文档内容的方法
Jan 23 PHP
smarty中常用方法实例总结
Aug 07 PHP
详解PHP对象的串行化与反串行化
Jan 24 PHP
php投票系统之增加与删除投票(管理员篇)
Jul 01 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
Apr 03 PHP
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
Oct 09 #PHP
简单的页面缓冲技术
Oct 09 #PHP
php 之 没有mysql支持时的替代方案
Oct 09 #PHP
在PWS上安装PHP4.0正式版
Oct 09 #PHP
在IIS上安装PHP4.0正式版
Oct 09 #PHP
html中select语句读取mysql表中内容
Oct 09 #PHP
用PHP实现ODBC数据分页显示一例
Oct 09 #PHP
You might like
PHP中error_reporting()函数的用法(修改PHP屏蔽错误)
2011/07/01 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
分享PHP-pcntl 实现多进程代码
2016/09/30 PHP
PHP实现给定一列字符,生成指定长度的所有可能组合示例
2019/06/22 PHP
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
理解JavaScript表单的基础知识
2016/01/25 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
2017/02/13 Javascript
svg动画之动态描边效果
2017/02/22 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
JS HTML图片显示Canvas 压缩功能
2017/07/21 Javascript
AngularJS 打开新的标签页实现代码
2017/09/07 Javascript
vue 项目软键盘回车触发搜索事件
2020/09/09 Javascript
python回调函数的使用方法
2014/01/23 Python
数据挖掘之Apriori算法详解和Python实现代码分享
2014/11/07 Python
简单介绍Python中用于求最小值的min()方法
2015/05/15 Python
使用Python求解最大公约数的实现方法
2015/08/20 Python
Python生态圈图像格式转换问题(推荐)
2019/12/02 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
2020/10/12 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
Html5+CSS3+EL表达式问题小结
2020/12/19 HTML / CSS
通用C#笔试题附答案
2016/11/26 面试题
生日宴会答谢词
2014/01/09 职场文书
《晏子使楚》教学反思
2014/02/08 职场文书
我的祖国演讲稿
2014/05/04 职场文书
小学生母亲节演讲稿
2014/05/07 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
关于晚自习早退的检讨书
2014/09/13 职场文书
2014年度安全工作总结
2014/12/04 职场文书
2015年档案管理员工作总结
2015/05/13 职场文书
车位出租协议书范本
2016/03/19 职场文书
JAVA API 实用类 String详解
2021/10/05 Java/Android
Kubernetes关键组件与结构组成介绍
2022/03/31 Servers
SpringBoot项目部署到阿里云服务器的实现步骤
2022/06/28 Java/Android