编写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自定义函数之递归删除文件及目录
Aug 08 PHP
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
May 17 PHP
记录mysql性能查询过程的使用方法
May 02 PHP
解析Linux下Varnish缓存的配置优化
Jun 20 PHP
zf框架的zend_cache缓存使用方法(zend框架)
Mar 14 PHP
PHP生成数组再传给js的方法
Aug 07 PHP
PHP获取数组长度或某个值出现次数的方法
Feb 11 PHP
PHP判断JSON对象是否存在的方法(推荐)
Jul 06 PHP
Zend Framework框架实现类似Google搜索分页效果
Nov 25 PHP
PHP实现的简单路由和类自动加载功能
Mar 13 PHP
PHP检查文件是否存在,不存在自动创建及读取文件内容操作示例
Jan 23 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
May 02 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删除二维数组中相同元素及数组重复值的方法示例
2017/05/05 PHP
php实现通过stomp协议连接ActiveMQ操作示例
2020/02/23 PHP
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
js如何获取兄弟、父类等节点
2014/01/06 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
浅谈String.valueOf()方法的使用
2016/06/06 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
JS中递归函数
2016/06/17 Javascript
微信小程序 animation API详解及实例代码
2016/10/08 Javascript
解决webpack打包速度慢的解决办法汇总
2017/07/06 Javascript
使用Angular CLI快速创建Angular项目的一些基本概念和写法小结
2018/04/22 Javascript
Vue实现左右菜单联动实现代码
2018/08/12 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
vue移动端城市三级联动组件使用详解
2019/07/26 Javascript
Vue表单控件数据绑定方法详解
2020/02/05 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
python BeautifulSoup设置页面编码的方法
2015/04/03 Python
利用python程序帮大家清理windows垃圾
2017/01/15 Python
python多维数组切片方法
2018/04/13 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
2018/12/12 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
Python调用C语言程序方法解析
2020/07/07 Python
记一次Django响应超慢的解决过程
2020/09/17 Python
python自动从arxiv下载paper的示例代码
2020/12/05 Python
Shopee菲律宾:在线购买和出售
2019/11/25 全球购物
挂职思想汇报
2013/12/31 职场文书
高中生职业生涯规划书
2014/02/24 职场文书
设备管理实施方案
2014/05/31 职场文书
员工生日活动方案
2014/08/24 职场文书
法人委托书范本格式
2014/09/15 职场文书
向国旗敬礼活动总结范文2014
2014/09/27 职场文书
初中中等生评语
2014/12/29 职场文书
党风廉政建设个人总结
2015/03/06 职场文书
CentOS7安装MySQL8的超级详细教程(无坑!)
2022/06/10 Servers