编写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 相关文章推荐
Windows下PHP5和Apache的安装与配置
Sep 05 PHP
php self,$this,const,static,-&amp;gt;的使用
Oct 22 PHP
php 过滤器实现代码
Aug 09 PHP
深入HTTP响应状态码速查表的详解
Jun 07 PHP
ThinkPHP CURD方法之field方法详解
Jun 18 PHP
php.ini save_handler 修改不生效的解决办法
Jul 22 PHP
浅谈php命令行用法
Feb 04 PHP
php实现的单一入口应用程序实例分析
Sep 23 PHP
UPUPW 更新 64 位 Apache 系列 PHP 7.0 正式版
Dec 08 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
Jan 07 PHP
thinkphp实现图片上传功能
Jan 13 PHP
PHP常用函数之格式化时间操作示例
Oct 21 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采用file_get_contents代替使用curl实例
2014/11/07 PHP
php的ddos攻击解决方法
2015/01/08 PHP
php实现通过ftp上传文件
2015/06/19 PHP
中高级PHP程序员应该掌握哪些技术?
2016/09/23 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
PHP基于面向对象封装的分页类示例
2019/03/15 PHP
jquery 可拖拽的窗体控件实现代码
2010/03/21 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
JavaScript.The.Good.Parts阅读笔记(二)作用域&amp;闭包&amp;减缓全局空间污染
2010/11/16 Javascript
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
封装的jquery翻页滚动(示例代码)
2013/11/18 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
2014/07/21 Javascript
easyui messager alert 三秒后自动关闭提示的实例
2016/11/07 Javascript
深入理解angular2启动项目步骤
2017/07/15 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
详解 vue.js用法和特性
2017/10/15 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
2018/04/05 Javascript
Node.js Express安装与使用教程
2018/05/11 Javascript
vue axios post发送复杂对象问题
2019/06/04 Javascript
JavaScript适配器模式原理与用法实例详解
2020/03/09 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
[03:56]DOTA2完美大师赛趣味视频之小鸽子和Mineski打台球
2017/11/24 DOTA
解决python爬虫中有中文的url问题
2018/05/11 Python
python抓取京东小米8手机配置信息
2018/11/13 Python
pandas数据筛选和csv操作的实现方法
2019/07/02 Python
Python 微信爬虫完整实例【单线程与多线程】
2019/07/06 Python
时尚孕妇装:Ingrid & Isabel
2019/05/08 全球购物
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
OLEDBConnection和SQLConnection有什么区别
2013/05/31 面试题
九年级化学教学反思
2014/01/28 职场文书
学雷锋志愿者活动方案
2014/08/21 职场文书
中职招生先进个人材料
2014/08/31 职场文书
计生办班子群众路线教育实践活动个人对照检查材料思想汇报
2014/10/04 职场文书
2015年教师见习期工作总结
2015/05/20 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书
java中重写父类方法加不加@Override详解
2021/06/21 Java/Android