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 存储文本换行实现方法
Jan 05 PHP
PHP服务器页面间跳转实现方法
Aug 02 PHP
利用php递归实现无限分类 格式化数组的详解
Jun 08 PHP
解决File size limit exceeded 错误的方法
Jun 14 PHP
php使用ICQ网关发送手机短信
Oct 30 PHP
PHP mkdir()无写权限的问题解决方法
Jun 19 PHP
PHP定时任务延缓执行的实现
Oct 08 PHP
Laravel 4 初级教程之视图、命名空间、路由
Oct 30 PHP
php继承中方法重载(覆盖)的应用场合
Feb 09 PHP
php计算整个mysql数据库大小的方法
Jun 19 PHP
php防止用户重复提交表单
Nov 02 PHP
PHP自定义函数获取汉字首字母的方法
Dec 01 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
ob_start(),ob_start('ob_gzhandler')使用
2006/12/25 PHP
PHP Stream_*系列函数
2010/08/01 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
2013/06/25 PHP
php单一接口的实现方法
2015/06/20 PHP
PHP中遇到的时区问题解决方法
2015/07/23 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
解决出现SoapFault (looks like we got no XML document)的问题
2017/06/24 PHP
键盘控制事件应用教程大全
2006/11/24 Javascript
如何判断图片地址是否失效
2007/02/02 Javascript
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
2009/12/27 Javascript
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
Notify - 基于jquery的消息通知插件
2011/10/18 Javascript
浅谈Javascript事件模拟
2012/06/27 Javascript
JavaScript 更严格的相等 [译]
2012/09/20 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
2015/09/11 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
Laydate时间组件在火狐浏览器下有多时间输入框时只能给第一个输入框赋值的解决方法
2016/08/18 Javascript
JavaScript之DOM_动力节点Java学院整理
2017/07/03 Javascript
9种使用Chrome Firefox 自带调试工具调试javascript技巧
2017/12/22 Javascript
Python中字符编码简介、方法及使用建议
2015/01/08 Python
详解Python中for循环的使用
2015/04/14 Python
python分析网页上所有超链接的方法
2015/05/08 Python
bpython 功能强大的Python shell
2016/02/16 Python
django 多数据库配置教程
2018/05/30 Python
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
2019/08/27 Python
Python利用for循环打印星号三角形的案例
2020/04/12 Python
python3.7 openpyxl 在excel单元格中写入数据实例
2020/09/01 Python
python 批量下载bilibili视频的gui程序
2020/11/20 Python
Lacoste澳大利亚官网:服装、鞋类及配饰
2018/11/14 全球购物
馥绿德雅美国官方网站:Rene Furterer头皮护理专家
2019/05/01 全球购物
怎样写好自荐信和推荐信
2013/12/26 职场文书
党的群众路线对照检查材料
2014/08/27 职场文书
python实现自动化群控的步骤
2021/04/11 Python