编写php应用程序实现摘要式身份验证的方法详解


Posted in PHP onJune 08, 2013

通基本身份认证一样,也可以使用PHP网页处理HTTP请求报头字段来匹配摘要式身份验证信息。例如下边的代码使用header()函数要求客户端使用Digest验证,它在HTTP消息报头中增加了一个WWW-Authenticate字段:
header('WWW-Authenticate:Digest Realm="MyRealm",nonce="47alf7cf25ce7",algorithm=MD5,qop="auth"');
--------------------------------------------------------------------------------
下边代码描述的是一个使用摘要式身份验证的网页(首先取消Apache验证配置)。

<?php
$realm="MyRealm";
//如果没有验证信息,则发送报头要求浏览器使用摘要式身份验证
if(!isset($_SERVER['PHP_AUTH_DIGEST'])){
 header("WWW-Authenticate:Digest Realm=/"$realm/",nonce=/"".uniqid()."/",algorithm=MD5,qop=/"auth/"");
 header("HTTP/1.0 401 Unauthorization Required");
 echo "账号/密码错误!";
 exit;
}else{
 //使用函数http_digest_parse解析验证信息
 $data=http_digest_parse($_SERVER["PHP_AUTH_DIGEST"]);
 if(!$data){
  header("HTTP/1.0 401 Unauthorization Required");
  echo "账号/密码错误!";
  exit;
  }else{
   //根据HTTP协议,自己构建一个response值
   $A1=md5('admin:'.$realm.':password');
   $A2=md5($_SERVER['REQUEST_METHOD'].':'.$data['uri']);
   $valid_response=
   md5($A1.':'.$data['nonce'].':'.$data['nc'].':'.$data['cnonce'].':'.$data['qop'].':'.$A2);}
   //将自己构建的response值与浏览器构建并发送过来的response值对比,如果相同那么就证明用户名和密码输入是正确的
   if($data['response']==$valid_response){
    echo "验证通过!";
   }else{
    header("HTTP/1.0 401 Unauthorization Required");
    echo("账号/密码错误!");
    exit;
   }
  }
function http_digest_parse($digest_str){
 $needed_parts=array('nonce'=>1,'nc'=>1,'cnonce'=>1,'qop'=>1,'username'=>1,'uri'=>1,'response'=>1);
 //使用正则表达式解析Authorization报头的内容
 preg_match_all('@(/w+)=([/'"]?)([a-zA-Z0-9=.//_-]+)/2@',$digest_str,$result,PREG_SET_ORDER);
 //将结果填充$data数组,并返回
 $data=array();
 foreach($result as $m){
  $data[$m[1]]=$m[3];
  unset($needed_parts[$m[1]]);
 }
 return $needed_parts?false:$data;
}
?>

PHP 相关文章推荐
PHP的FTP学习(一)[转自奥索]
Oct 09 PHP
使用PHP 5.0创建图形的巧妙方法
Oct 12 PHP
php模板中出现空行解决方法
Mar 08 PHP
PHP函数篇之掌握ord()与chr()函数应用
Dec 05 PHP
FireFox浏览器使用Javascript上传大文件
Oct 30 PHP
php中\r \r\n \t的区别示例介绍
Feb 08 PHP
php获取随机数组列表的方法
Nov 13 PHP
Joomla数据库操作之JFactory::getDBO用法
May 05 PHP
PHP线程的内存回收问题
Jul 08 PHP
PHP面试常用算法(推荐)
Jul 22 PHP
删除PHP数组中的重复元素的实现代码
Apr 10 PHP
PHP中常用的魔术方法
Apr 28 PHP
探讨方法的重写(覆载)详解
Jun 08 #PHP
php类常量的使用详解
Jun 08 #PHP
深入分析php中接口与抽象类的区别
Jun 08 #PHP
探讨PHP中this,self,parent的区别详解
Jun 08 #PHP
深入php self与$this的详解
Jun 08 #PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
Jun 07 #PHP
解析dedeCMS验证码的实现代码
Jun 07 #PHP
You might like
基于empty函数的判断详解
2013/06/17 PHP
本地计算机无法启动Apache故障处理
2014/08/08 PHP
php实现学生管理系统
2020/03/21 PHP
php数值转换时间及时间转换数值用法示例
2017/05/18 PHP
php7安装mongoDB扩展的方法分析
2017/08/02 PHP
初学prototype,发个JS接受URL参数的代码
2006/09/25 Javascript
javascript下阻止表单重复提交、防刷新、防后退
2007/08/17 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
jQuery 回调函数(callback)的使用和基础
2015/02/26 Javascript
jQuery实现仿腾讯微博滑出效果报告每日天气的方法
2015/05/11 Javascript
js实现数字递增特效【仿支付宝我的财富】
2017/05/05 Javascript
基于jQuery对象和DOM对象和字符串之间的转化实例
2017/08/08 jQuery
详解vue中axios请求的封装
2019/04/08 Javascript
vuex实现购物车的增加减少移除
2020/06/28 Javascript
openLayer4实现动态改变标注图标
2020/08/17 Javascript
[11:44]Ti9 OG夺冠时刻
2019/08/25 DOTA
python读取Android permission文件
2013/11/01 Python
Python二分查找详解
2015/09/13 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
详解Django的CSRF认证实现
2018/10/09 Python
Python实现的列表排序、反转操作示例
2019/03/13 Python
python实现五子棋人机对战游戏
2020/03/25 Python
Python Pandas中根据列的值选取多行数据
2019/07/08 Python
python单例模式的多种实现方法
2019/07/26 Python
详解python 利用echarts画地图(热力图)(世界地图,省市地图,区县地图)
2019/08/06 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
在vscode中配置python环境过程解析
2019/09/28 Python
Django 解决上传文件时,request.FILES为空的问题
2020/05/20 Python
matplotlib.pyplot.plot()参数使用详解
2020/07/28 Python
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
德国在线香料制造商:Gewürzland
2020/03/10 全球购物
工程师岗位职责
2013/11/08 职场文书
纪念建党演讲稿范文
2014/01/13 职场文书
展览会邀请函
2015/02/02 职场文书
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js
python运算符之与用户交互
2022/04/13 Python