用户在设计和维护站点的时候,经常需要限制对某些重要文件或信息的访问。通常,我们可以采用内置于WEB服务器的基于HTTP协议的用户身份验证机制。 当访问者浏览受保护页面时,客户端浏览器会弹出对话窗口要求用户输入用户名和密码,对用户的身份进行验证,以决定用户是否有权访问页面。下面用两种方法来说明其实现原理。

  一、用HTTP标头来实现

  标头是服务器以HTTP协议传送HTML信息到浏览器前所送出的字串。HTTP采用一种挑战/响应模式对试图进入受密码保护区域的用户进行身份验证。具体来说,当用户首次向WEB服务器发出访问受保护区域的请求时,挑战进程被启动,服务器返回特殊的401标头,表明该用户身份未经验证。客户端浏览器在检测到上述响应之后自动弹出对话框,要求用户输入用户名和密码。用户完成输入之后点击确定,其身份识别信息就被传送到服务端进行验证。如果用户输入的用户名和密码有效,WEB服务器将允许用户进入受保护区域,并且在整个访问过程中保持其身份的有效性。相反,若用户输入的用户名称或密码无法通过验证,客户端浏览器会不断弹出输入窗口要求用户再次尝试输入正确的信息。整个过程将一直持续到用户输入正确的信息位置,也可以设定允许用户进行尝试的最大次数,超出时将自动拒绝用户的访问请求。

  在PHP脚本中,使用函数header()直接给客户端的浏览器发送HTTP标头,这样在客户端将会自动弹出用户名和密码输入窗口,来实现我们的身份认证功能。在PHP中,客户端用户输入的信息传送到服务器之后自动保存在 $PHP_AUTH_USER,$PHP_AUTH_PW,以及 $PHP_AUTH_TYPE这三个全局变量中。利用这三个变量,我们可以根据保存在数据文件或者数据库中用户帐号信息来验证用户身份!

不过,需要提醒使用者注意的是:只有在以模块方式安装的PHP中才能使用$PHP_AUTH_USER,$PHP_AUTH_PW,以及 $PHP_AUTH_TYPE这三个变量。如果用户使用的是CGI模式的PHP则无法实现验证功能。在本节后附有PHP的模块方式安装方法。

  下面我们用Mysql数据库来存储用户的身份。我们需要从数据库中提取每个帐号的用户名和密码以便与$PHP_AUTH_USER和$PHP_AUTH_PW变量进行比较,判断用户的真实性。

  首先,在MySql中建立一个存放用户信息的数据库

  数据库名为XinXiKu ,表名为user;表定义如下:

View Code

1 create table user(
2 ID INT(4) NOT NULL AUTO_INCREMENT,
3 name VARCHAR(8) NOT NULL,
4 password CHAR(8) NOT NULL,
5  PRIMARY KEY(ID)
6 )

  说明:

  1、ID为一个序列号,不为零而且自动递增,为主键;

  2、name为用户名,不能为空;

  3、password为用户密码,不能为空;

  以下是用户验证文件login.php

View Code

1 //判断用户名是否设置
2 if(!isset($PHP_AUTH_USER))
3 {
4 header("WWW-Authenticate:Basic realm="身份验证功能"");
5 header("HTTP/1.0 401 Unauthorized");
6 echo "身份验证失败,您无权共享网络资源!";
7 exit();
8 }
9 /*连接数据库*/
10 $db=mysql_connect("localhost","root","");
11 //选择数据库
12 mysql_select_db("XinXiKu",$db);
13 //查询用户是否存在
14 $result=mysql_query("SELECT * FROM user where name='$PHP_AUTH_USER' and password='$PHP_AUTH_PW'",$db);
15 if ($myrow = mysql_fetch_row($result))
16 {
17 //以下为身份验证成功后的相关操作
18 ...
19 }
20 else
21 {
22 //身份验证不成功,提示用户重新输入
23 header("WWW-Authenticate:Basic realm="身份验证功能"");
24 header("HTTP/1.0 401 Unauthorized");
25 echo "身份验证失败,您无权共享网络资源!";
26 exit();
27 }
28 ?>

  程序说明:

在程序中,首先检查变量$PHP_AUTH_USER是否已经设置。如果没有设置,说明需要验证,脚本发出HTTP 401错误号头标,告诉客户端的浏览器需要进行身份验证,由客户端的浏览器弹出一个身份验证窗口,提示用户输入用户名和密码,输入完成后,连接数据库,查询该用用户名及密码是否正确,如果正确,允许登录进行相关操作,如果不正确,继续要求用户输入用户名和密码。

  函数说明:

  1、isset():用于确定某个变量是否已被赋值。根据变量值是否存在,返回true或false

  2、header():用于发送特定的HTTP标头。注意,使用header()函数时,一定要在任何产生实际输出的HTML或PHP代码前面调用该函数。

  3、mysql_connect():打开 MySQL 服务器连接。

  4、mysql_db_query():送查询字符串 (query) 到 MySQL 数据库。

  5、mysql_fetch_row():返回单列的各字段。

  二、用session实现服务器验证

  对于需要身份验证的页面,使用apache服务器验证是最好不过的了。但是,apache服务器验证的界面不够友好。而且,cgi模式的php,iis下的php,都不能使用apache服务器验证。这样,我们可以利用session在不同页面间保存用户身份,达到身份验证的目的。

  在后端我们同样利用上面的Mysql数据库存放用户信息。

  我们先编写一个用户登录界面,文件名为login.php,代码职下:

View Code

1 <form action="login1.php">
2 用户名:<input type="text" name="name"><br>
3 口 令:<input type="text" name="pass"><br>
4 <input type="submit" value="登录">
5 </form>

login1.php处理提交的表单,代码如下:

View Code

1 $db=mysql_connect("localhost","root","");
2 mysql_select_db("XinXiKu",$db);
3 $result=mysql_query("SELECT * FROM user where name='$name' and password='$pass'",$db);
4 if ($myrow = mysql_fetch_row($result))
5 {
6 //注册用户
7 session_start();
8 session_register("user");
9 $user=$myrow["user"];
10 // 身份验证成功,进行相关操作
11 ...
12 }
13 else
14 {
15 echo"身份验证失败,您无权共享网络资源!";
16 }
17 ?>

这里需要说明的是,用户可以使用在后续的操作中用**http://domainname/next.php?user=用户名 **来绕过身份验证。所以,后续的操作应先检查变量是否注册:已注册,则进行相应操作,否则视为非法登录。相关代码如下:

View Code

1 session_start();
2 if (!session_is_registered("user"))
3 {
4 echo "身份验证失败,属于非法登录!";
5 }
6 else
7 {
8 //成功登录进行相关操作
9 ...
10 }
11 ?>

附录:PHP以模块方式安装方法

  1、首先下载文件:mod_php4-4.0.1-pl2。[如果你的不是PHP4,那么就赶快升级吧!]

  解开后有三个文件:mod_php4.dll、mod_php4.conf、readme.txt

  2、相关文件拷贝

  把mod_php4.dll拷贝到apache安装目录的modules目录下面

  把mod_php4.conf拷贝到apache安装目录的conf目录下面

  把msvcrt.dll文件拷贝到apache的安装目录下面

  3、打开conf/srm.conf文件 ,在其中加上一句

  Include conf/mod_php4.conf

  在做这一些之前请把您的httpd.conf中关于CGI模式的所以设置语句都去掉,即类似下面的部分!
ScripAlias /php4/ "C:/php4/"
AddType application/x-httpd-php4 .php
AddType application/x-httpd-php4 .php3
AddType application/x-httpd-php4 .php4
Action application/x-httpd-php4 /php4/php.exe

要想使PHP支持更多的后缀名,没问题。在给出的配置文件mod_php4.conf已经支持了三种后缀名php,php3,php4,如果你还想支持更多的后缀名可以更改这个文件,很简单的。

  4、测试

  用<? phpinfo(); ?> 测试。会看到Server API的值为apache,而不是cgi ,而且还有有关HTTP Headers Information的信息。

转自:http://tech.ddvip.com/2007-08/118755084432385.html

转载于:https://www.cnblogs.com/mahy/archive/2011/06/03/2072197.html

转:实例学习PHP程序对用户身份认证实现两种方法相关推荐

  1. 域用户迁移适用的两种方法

    在企业域林环境中,域用户的调动变更情况会经常遇到,面对这样的棘手问题,我们解决域用户迁移主要有两种方法:一种是使用微软ADMT2.0工具把域用户进行迁移:另一种是采取建立新用户把原有权限复制过来,再把 ...

  2. 将uni-app打包的H5放在 Android程序中在 webview 显示的两种方法

    将uni-app打包的H5放在 Android程序中在 webview 显示的两种方法 前言 Hash History 完事 前言 之前有个项目要同时做小程序和APP,本着节省时间的想法,研究了下un ...

  3. python程序中结束while循环的两种方法是_Python中while循环

    一.while 简介 Python 的循环有 for 和 while 两种,while 为条件控制循环,通过条件表达式控制循环结束. 流程图如下: Python 中 while 语句的格式如下: wh ...

  4. Swift中实现用户输入防抖动的两种方法

    功能需求 用户通过App搜索服务器中的数据,当用户在搜索框中输入关键字时,要求App将关键字通过网络连接传递到服务器接口,并返回服务器的搜索结果. 这里有个问题:假设用户最终想要输入的关键字为pand ...

  5. 用户权限验证的两种方法

    用户权限验证 intercept拦截器使用 之前在进行登录状态判断时用的是intercept拦截器进行拦截处理,配合Jwt生成token,在客户端发送请求时检查请求头里有无携带token,并验证tok ...

  6. nginx做小程序外链跳转_小程序跳转外部链接怎么设置,实现小程序跳转外链的两种方法...

    小程序跳转到外部链接有很多种类型,包括小程序跳转到APP,小程序跳转到小程序,小程序跳转到公众号,小程序跳转到网页等.由于小程序跳转的对象比较多,各自的规则又不一样,因此小程序跳转外部链接是用户咨询较 ...

  7. PHP网站开启gzip压缩,PHP网站程序中开启Gzip压缩的两种方法

    // htaccess RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L] //项目根路径 define('ABSPATH', dirname(__FILE__) ...

  8. 微信小程序之picker选择器获取值得两种方法

    想要实现的效果: 在选择器选择合适的选项后,页面显示所选择的内容 第一种方法: //wxml页面 <picker bindchange="PickerChange" valu ...

  9. 构建具有用户身份认证的 React + Flux 应用程序

    序言:这是一篇内容详实的 React + Flux 教程,文章主要介绍了如何使用 API 获取远程数据以及如何使用 JSON Web Tokens 进行用户身份认证.在阅读本文之后,我一直使用文章介绍 ...

最新文章

  1. php 图片 cdn,PHP文件生成的图片无法使用CDN缓存的解决方法
  2. mats显卡测试软件的使用教程,MATS使用说明
  3. 其他数据类型的一些操作
  4. 2011年12月份学习总结,在PE的前端标准思考和萌芽
  5. R语言里面的循环变量
  6. 键盘发展简史:144年独孤求败的QWERT键盘
  7. css_input[checked]复选框去掉默认样式并添加新样式
  8. VBA中 各种数据类型的使用(自定义数据类型Type,数组,数据字典)、读写文件
  9. 6.3 API : XGBoost
  10. js 将字符串分割为数组
  11. 简述什么是SQL注入,写出简单的SQL注入语句。
  12. 【机器学习】图解机器学习神器:Scikit-Learn
  13. 手机word如何转换html,如何把Word转换为网页html格式
  14. springboot + vue 搭建使用maven+ant构建
  15. 微信电脑多开,骚操作走起
  16. springboot整合mybatis拦截器分页
  17. python excel条件格式_Python操作Excel学习笔记(28):条件格式
  18. closest() 方法
  19. arch模型 python_【时间序列】波动率建模之ARCH模型
  20. 【PyTorch教程】P27、28、29 完整的模型套路

热门文章

  1. Verifying Checksum ... Bad Data CRC ERROR: can#39;t get kernel image!
  2. 一个很有借鉴价值的编程故事(转)
  3. 使用date命令,进行时间戳和日期时间的互转
  4. mysql stored procedures with return values
  5. Extjs4中up()和down()的用法以及组件查找_ComponentQuery类
  6. iOS并发(多线程)
  7. 从open系统调用的源码看文件的打开过程
  8. 分布式服务常见问题—分布式事务
  9. 怎么解决64位Access与32位不能同时安装的问题
  10. ARP(Address Resolution Protocol)地址解析协议初识