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 相关文章推荐
Discuz 5.0 中读取纯真IP数据库函数分析
Mar 16 PHP
IP138 IP地址查询小偷实现代码
Feb 15 PHP
PHP中防止SQL注入实现代码
Feb 19 PHP
PHP中读写文件实现代码
Oct 20 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
Feb 04 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
Jun 21 PHP
PHP中spl_autoload_register()和__autoload()区别分析
May 10 PHP
PHP+MYSQL会员系统的开发实例教程
Aug 23 PHP
php实现用手机关闭计算机(电脑)的方法
Apr 22 PHP
摘自织梦CMS中的图片处理类
Aug 08 PHP
thinkPHP5框架auth权限控制类与用法示例
Jun 12 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
Apr 10 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 strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
php中使用websocket详解
2016/09/23 PHP
thinkPHP5框架auth权限控制类与用法示例
2018/06/12 PHP
CI框架实现创建自定义类库的方法
2018/12/25 PHP
PHP htmlentities()函数用法讲解
2019/02/25 PHP
PHP命名空间定义与用法实例分析
2019/08/14 PHP
基于jQuery的input输入框下拉提示层(自动邮箱后缀名)
2012/06/14 Javascript
jquery获取所有选中的checkbox实现代码
2016/05/26 Javascript
JS从一组数据中找到指定的单条数据的方法
2016/06/02 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
vue-cli webpack 开发环境跨域详解
2017/05/18 Javascript
js判断用户是输入的地址请求的路径(实例讲解)
2017/07/18 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
js和jQuery以及easyui实现对下拉框的指定赋值方法
2018/01/23 jQuery
使用layui 渲染table数据表格的实例代码
2018/08/19 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
Vuejs监听vuex中值的变化的方法示例
2018/12/02 Javascript
Nuxt v-bind绑定img src不显示的解决
2019/12/05 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
Python中取整的几种方法小结
2017/01/06 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
2018/04/28 Python
通过pycharm使用git的步骤(图文详解)
2019/06/13 Python
Python测试模块doctest使用解析
2019/08/10 Python
澳大利亚的奢侈品牌:Oroton
2016/08/26 全球购物
有750多个顶级品牌的瑞士时尚在线:ABOUT YOU
2017/01/04 全球购物
日本最大美瞳直送网:Morecontact(中文)
2019/04/03 全球购物
英国购买威士忌网站:Master of Malt
2019/09/26 全球购物
Static Nested Class 和 Inner Class的不同
2013/11/28 面试题
医学检验专业大学生求职信
2013/11/18 职场文书
在校学生职业规划范文
2014/01/08 职场文书
国窖1573广告词
2014/03/21 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
《我和小伙伴》教学反思
2016/02/20 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
vue组件的路由高亮问题解决方法
2021/05/11 Vue.js