编写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下将多个数组合并成一个数组的方法与实例代码
Feb 03 PHP
php中使用exec,system等函数调用系统命令的方法(不建议使用,可导致安全问题)
Sep 07 PHP
PHP命名空间(Namespace)的使用详解
May 04 PHP
php+html5使用FormData对象提交表单及上传图片的方法
Feb 11 PHP
PHP查看当前变量类型的方法
Jul 31 PHP
两款万能的php分页类
Nov 12 PHP
Zend Framework框架教程之Zend_Db_Table_Rowset用法实例分析
Mar 21 PHP
PHP 常用时间函数资料整理
Oct 22 PHP
php简单实现文件或图片强制下载的方法
Dec 06 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
Feb 07 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
Feb 07 PHP
PHP中的异常处理机制深入讲解
Nov 10 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脚本的10个技巧(1)
2006/10/09 PHP
php绘制一条弧线的方法
2015/01/24 PHP
编写PHP脚本过滤用户上传的图片
2015/07/03 PHP
详解cookie验证的php应用的一种SSO解决办法
2017/10/20 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
checkbox 复选框不能为空
2009/07/11 Javascript
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性
2012/10/11 Javascript
js实例属性和原型属性示例详解
2014/11/23 Javascript
javascript中定义类的方法汇总
2014/12/28 Javascript
javascript解决小数的加减乘除精度丢失的方案
2016/05/31 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
Vue.js中组件中的slot实例详解
2017/07/17 Javascript
Node.JS循环删除非空文件夹及子目录下的所有文件
2018/03/12 Javascript
JS实现换肤功能的方法实例详解
2019/01/30 Javascript
详解js创建对象的几种方法及继承
2019/04/12 Javascript
详解vue 动态加载并注册组件且通过 render动态创建该组件
2019/05/30 Javascript
vue使用高德地图根据坐标定位点的实现代码
2019/08/22 Javascript
js针对图片加载失败的处理方法分析
2019/08/24 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
[01:07]DOTA2次级职业联赛 - Fpb战队宣传片
2014/12/01 DOTA
Python max内置函数详细介绍
2016/11/17 Python
python调用staf自动化框架的方法
2018/12/26 Python
python实现windows壁纸定期更换功能
2019/01/21 Python
jenkins+python自动化测试持续集成教程
2020/05/12 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
html5 touch事件实现页面上下滑动效果【附代码】
2016/03/10 HTML / CSS
米兰必去买手店排行榜首位:Antonioli
2016/09/11 全球购物
中国跨境电子商务网站:NewFrog
2018/03/10 全球购物
盛大笔试题
2016/11/05 面试题
介绍一下Make? 为什么使用make
2013/12/08 面试题
网络工程师的自我评价
2013/10/02 职场文书
医院检讨书范文
2014/02/01 职场文书
生物制药专业自我鉴定
2014/02/19 职场文书
大一学生职业生涯规划
2014/03/11 职场文书
共产党员公开承诺书范文
2014/03/28 职场文书