编写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 相关文章推荐
文章推荐系统(三)
Oct 09 PHP
PHP 面向对象 final类与final方法
May 05 PHP
组合算法的PHP解答方法
Feb 04 PHP
php 去除html标记--strip_tags与htmlspecialchars的区别详解
Jun 26 PHP
ThinkPHP查询语句与关联查询用法实例
Nov 01 PHP
PHP简单实现生成txt文件到指定目录的方法
Apr 25 PHP
php使用include 和require引入文件的区别
Feb 16 PHP
PHP写的简单数字验证码实例
May 23 PHP
YII2框架中excel表格导出的方法详解
Jul 21 PHP
PHP应用跨时区功能的实现方法
Mar 21 PHP
不常用但很实用的PHP预定义变量分析
Jun 25 PHP
laravel框架中间件 except 和 only 的用法示例
Jul 12 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
关于PHP中的Class的几点个人看法
2006/10/09 PHP
PHP 类商品秒杀计时实现代码
2010/05/05 PHP
discuz免激活同步登入代码修改方法(discuz同步登录)
2013/12/24 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
Javascript &amp; DHTML 实例编程(教程)DOM基础和基本API
2007/06/02 Javascript
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
jquery向.ashx文件post中文乱码问题的解决方法
2011/03/28 Javascript
js匿名函数的调用示例(形式多种多样)
2014/08/20 Javascript
jquery通过load获取文件的内容并跳到锚点的方法
2015/01/29 Javascript
JS实现网页Div层Clone拖拽效果
2015/09/26 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
2017/09/15 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
JS/HTML5游戏常用算法之路径搜索算法 随机迷宫算法详解【普里姆算法】
2018/12/13 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
2018/12/16 Javascript
Vue vm.$attrs使用场景详解
2020/03/08 Javascript
vue实现禁止浏览器记住密码功能的示例代码
2021/02/03 Vue.js
[53:21]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-CDEC
2014/05/22 DOTA
python自定义解析简单xml格式文件的方法
2015/05/11 Python
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
Python如何实现动态数组
2019/11/02 Python
python读取ini配置的类封装代码实例
2020/01/08 Python
美国最好的保健品打折网店:Swanson
2017/08/04 全球购物
市级青年文明号申报材料
2014/05/26 职场文书
应届大专生自荐书
2014/06/16 职场文书
学习群众路线的心得体会
2014/11/05 职场文书
律政俏佳人观后感
2015/06/09 职场文书
2019大学生预备党员转正思想汇报
2019/06/21 职场文书
写一个Python脚本自动爬取Bilibili小视频
2021/04/24 Python
python自动计算图像数据集的RGB均值
2021/06/18 Python
python编程实现清理微信重复缓存文件
2021/11/01 Python
MySQL数据库中varchar类型的数字比较大小的方法
2021/11/17 MySQL