编写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 02 PHP
Ajax+PHP边学边练 之五 图片处理
Dec 03 PHP
提高PHP编程效率 引入缓存机制提升性能
Feb 15 PHP
PHP5与MySQL数据库操作常用代码 收集
Mar 21 PHP
PHP Zip压缩 在线对文件进行压缩的函数
May 26 PHP
PHP中实现生成静态文件的方法缓解服务器压力
Jan 07 PHP
php中的filesystem文件系统函数介绍及使用示例
Feb 13 PHP
thinkphp修改配置进入默认首页的方法
Feb 07 PHP
PHP laravel中的多对多关系实例详解
Jun 07 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
redis+php实现微博(三)微博列表功能详解
Sep 23 PHP
php与阿里云短信接口接入操作案例分析
May 27 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制作静态网站的模板框架
2006/10/09 PHP
PHP通过iconv将字符串从GBK转换为UTF8字符集
2011/07/18 PHP
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
php强制更新图片缓存的方法
2015/02/11 PHP
php邮件发送的两种方式
2020/04/28 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
iis6+javascript Add an Extension File
2007/06/13 Javascript
Jquery插件之多图片异步上传
2010/10/20 Javascript
提高javascript效率 一次判断,而不要次次判断
2012/03/30 Javascript
jquery mobile 移动web(5)
2015/12/20 Javascript
jquery中live()方法和bind()方法区别分析
2016/06/23 Javascript
微信小程序开发之圆形菜单 仿建行圆形菜单实例
2016/12/12 Javascript
移动端脚本框架Hammer.js
2016/12/15 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
2017/03/13 Javascript
JS通过调用微信API实现微信支付功能的方法示例
2017/06/29 Javascript
node.js调用C++函数的方法示例
2018/09/21 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
[02:56]DOTA2英雄基础教程 巨魔战将
2013/12/10 DOTA
Python深入学习之特殊方法与多范式
2014/08/31 Python
python爬取拉勾网职位数据的方法
2018/01/24 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
2018/02/10 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
TensorFlow2.0:张量的合并与分割实例
2020/01/19 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
Django serializer优化类视图的实现示例
2020/07/16 Python
CSS3弹性盒模型开发笔记(二)
2016/04/26 HTML / CSS
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
墨西哥网上购物:Linio墨西哥
2016/10/20 全球购物
Clearly新西兰:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
Schecker荷兰:狗狗用品和配件
2019/06/06 全球购物
详细的大学生创业计划书模板
2014/01/27 职场文书
《与象共舞》教学反思
2014/02/24 职场文书
2015新学期家长寄语
2015/02/26 职场文书
实习感想范文
2015/08/10 职场文书
2019入党申请书格式和范文
2019/06/25 职场文书