编写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循环输出数据库内容的代码
May 24 PHP
让PHP开发者事半功倍的十大技巧小结
Apr 20 PHP
国外比较好的几个的Php开源建站平台小结
Apr 22 PHP
UCenter中的一个可逆加密函数authcode函数代码
Jul 20 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
Jun 22 PHP
php使用标签替换的方式生成静态页面
May 21 PHP
分享php分页的功能模块
Jun 16 PHP
PHP使用curl制作简易百度搜索
Nov 03 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
php提供实现反射的方法和实例代码
Sep 17 PHP
用Laravel轻松处理千万级数据的方法实现
Dec 25 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实现的漂亮分页方法
2014/04/17 PHP
PHP中几个可以提高运行效率的代码写法、技巧分享
2014/08/21 PHP
PHP CURL 内存泄露问题解决方法
2015/02/12 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
php实现图片上传并进行替换操作
2016/03/15 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
2019/12/04 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
appendChild() 或 insertBefore()使用与区别介绍
2013/10/11 Javascript
jquery为页面增加快捷键示例
2014/01/31 Javascript
Js Jquery创建一个弹出层可加载一个页面
2014/05/08 Javascript
javascript结合CSS实现苹果开关按钮特效
2015/04/07 Javascript
jQuery模仿阿里云购买服务器选择购买时间长度的代码
2016/04/29 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
js原生实现移动端手指滑动轮播图效果的示例
2018/01/02 Javascript
小程序云开发如何实现图片上传及发表文字
2019/05/17 Javascript
Vue仿微信app页面跳转动画效果
2019/08/21 Javascript
[41:37]DOTA2北京网鱼队选拔赛——冲击职业之路
2015/04/13 DOTA
[39:52]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第一场
2018/04/04 DOTA
Python使用xlrd模块操作Excel数据导入的方法
2015/05/26 Python
Python解析命令行读取参数--argparse模块使用方法
2018/01/23 Python
对python-3-print重定向输出的几种方法总结
2018/05/11 Python
白宫黑市官网:White House Black Market
2016/11/17 全球购物
意大利网上药房:Farmacia 33
2020/01/27 全球购物
资产评估专业学生的自我鉴定
2013/11/14 职场文书
技校毕业生的自我评价
2013/12/27 职场文书
小学生班会演讲稿
2014/01/09 职场文书
政风行风自查自纠报告
2014/10/21 职场文书
会计师事务所实习证明
2014/11/16 职场文书
2014年妇产科工作总结
2014/12/08 职场文书
2015年初三班主任工作总结
2015/05/21 职场文书
宾馆客房管理制度
2015/08/06 职场文书
微信小程序和php的登录实现
2021/04/01 PHP
MySQL令人咋舌的隐式转换
2021/04/05 MySQL