编写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扩展图文教程
Dec 12 PHP
PHP设计模式之责任链模式的深入解析
Jun 13 PHP
深入PHP购物车模块功能分析(函数讲解,附源码)
Jun 25 PHP
PHP基于单例模式实现的数据库操作基类
Jan 15 PHP
Zend Framework教程之Zend_Db_Table表关联实例详解
Mar 23 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
Feb 15 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
Jun 29 PHP
PHP共享内存使用与信号控制实例分析
May 09 PHP
laravel获取不到session的三种解决办法【推荐】
Sep 16 PHP
Laravel获取所有的数据库表及结构的方法
Oct 10 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 PHP
安装PHP扩展时解压官方 tgz 文件后没有configure文件无法进行配置编译的问题
Aug 26 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和ACCESS写聊天室(六)
2006/10/09 PHP
PHP学习资料汇总与网址
2007/03/16 PHP
php 404错误页面实现代码
2009/06/22 PHP
PHP下对数组进行排序的函数
2010/08/08 PHP
使用迭代器 遍历文件信息的详解
2013/06/08 PHP
PHP使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
php浏览历史记录的方法
2015/03/10 PHP
jquery text()要注意啦
2009/10/30 Javascript
深入理解JavaScript函数参数(推荐)
2016/07/26 Javascript
深入理解JavaScript中的尾调用(Tail Call)
2017/02/07 Javascript
动态加载JavaScript文件的3种方式
2018/05/05 Javascript
用JS实现根据当前时间随机生成流水号或者订单号
2018/05/31 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
JS浏览器BOM常见操作实例详解
2020/04/27 Javascript
Python中使用PIL库实现图片高斯模糊实例
2015/02/08 Python
python数据类型_字符串常用操作(详解)
2017/05/30 Python
Sanic框架路由用法实例分析
2018/07/16 Python
基于Numpy.convolve使用Python实现滑动平均滤波的思路详解
2019/05/16 Python
python语言基本语句用法总结
2019/06/11 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
python实现视频读取和转化图片
2019/12/10 Python
python实现查找所有程序的安装信息
2020/02/18 Python
Python常用编译器原理及特点解析
2020/03/23 Python
解决pyinstaller打包运行程序时出现缺少plotly库问题
2020/06/02 Python
完美解决IE8下不兼容rgba()的问题
2017/03/31 HTML / CSS
索尼巴西商店:Sony巴西
2019/06/21 全球购物
StubHub中国:购买和出售全球活动门票
2020/01/01 全球购物
康拓普公司Java笔面试
2016/09/23 面试题
高三自我鉴定
2013/10/23 职场文书
语文教育专业应届生求职信
2013/11/23 职场文书
一年级数学教学反思
2014/02/01 职场文书
机械专业技术员求职信
2014/06/14 职场文书
公安局负责人查摆问题及整改方案
2014/09/27 职场文书
鼋头渚导游词
2015/02/05 职场文书
考生诚信考试承诺书(2016版)
2016/03/25 职场文书