编写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维护文件系统
Oct 09 PHP
分享PHP入门的学习方法
Jan 02 PHP
PHP中的float类型使用说明
Jul 27 PHP
用C/C++扩展你的PHP 为你的php增加功能
Sep 06 PHP
ThinkPHP控制器里javascript代码不能执行的解决方法
Nov 22 PHP
ThinkPHP中Session用法详解
Nov 29 PHP
给WordPress的编辑后台添加提示框的代码实例分享
Dec 25 PHP
PHP编写RESTful接口的方法
Feb 21 PHP
php实现简单爬虫的开发
Mar 28 PHP
PHP更安全的密码加密机制Bcrypt详解
Jun 18 PHP
php实现数字补零的方法总结
Sep 12 PHP
PHP实现带进度条的Ajax文件上传功能示例
Jul 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小技巧之JS和CSS优化工具Minify的使用方法
2014/05/19 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
基于PHP-FPM进程池探秘
2017/10/17 PHP
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
append和appendTo的区别以及appendChild用法
2013/12/24 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
javascript实现在线客服效果
2015/07/15 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
AngularJS 路由和模板实例及路由地址简化方法(必看)
2016/06/24 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
2016/08/20 Javascript
javascript的document中的动态添加标签实现方法
2016/10/24 Javascript
关于angularJs指令的Scope(作用域)介绍
2016/10/25 Javascript
Bootstrap Modal遮罩弹出层代码分享
2016/11/21 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
2017/06/26 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
使用Vue的slot插槽分发父组件内容实现高度复用、更加灵活的组件(推荐)
2018/05/01 Javascript
Vue父子组件双向绑定传值的实现方法
2018/07/31 Javascript
使用python装饰器计算函数运行时间的实例
2018/04/21 Python
Django框架 querySet功能解析
2019/09/04 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
python绘制高斯曲线
2021/02/19 Python
来自世界上最好大学的在线课程:edX
2018/10/16 全球购物
护理毕业生自荐信范文
2013/12/22 职场文书
yy司仪主持词
2014/03/22 职场文书
小区推广策划方案
2014/06/06 职场文书
领导干部贪图享乐整改措施
2014/09/21 职场文书
夫妻房产协议书的格式
2014/10/11 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
党校个人总结
2015/03/04 职场文书
起诉书格式范文
2015/05/20 职场文书
锦旗赠语
2015/06/23 职场文书
2015最新婚礼司仪主持词
2015/06/30 职场文书
关于flex 上下文中自动 margin的问题(完整例子)
2021/05/20 HTML / CSS
详解Python requests模块
2021/06/21 Python