编写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 随机数的产生、页面跳转、件读写、文件重命名、switch语句
Aug 07 PHP
无JS,完全php面向过程数据分页实现代码
Aug 27 PHP
php颜色转换函数hex-rgb(将十六进制格式转成十进制格式)
Sep 23 PHP
php获取文件夹路径内的图片以及分页显示示例
Mar 11 PHP
Yii框架登录流程分析
Dec 03 PHP
WebQQ最新登陆协议的用法
Dec 22 PHP
php使用wordwrap格式化文本段落的方法
Mar 17 PHP
Yii2中cookie用法示例分析
Jul 18 PHP
Yii2实现自定义独立验证器的方法
May 05 PHP
ThinkPHP实现转换数据库查询结果数据到对应类型的方法
Nov 16 PHP
零基础php编程好学吗
Oct 11 PHP
php实现统计IP数及在线人数的示例代码
Jul 22 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
为什么夜间收到的中波电台比白天多
2021/03/01 无线电
php异常:Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE  eval()'d code error
2011/05/19 PHP
Zend Studio 实用快捷键一览表(精心整理)
2013/08/10 PHP
php生成QRcode实例
2014/09/22 PHP
PHP使用feof()函数读文件的方法
2014/11/07 PHP
php+ajax实现文章自动保存的方法
2014/12/30 PHP
Laravel 5 框架入门(四)完结篇
2015/04/09 PHP
解读PHP的Yii框架中请求与响应的处理流程
2016/03/17 PHP
PHP静态延迟绑定和普通静态效率的对比
2017/10/20 PHP
PDO::setAttribute讲解
2019/01/29 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
Prototype 学习 工具函数学习($A方法)
2009/07/12 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
2020/12/24 Javascript
详解JavaScript中localStorage使用要点
2016/01/13 Javascript
javascript中对Date类型的常用操作小结
2016/05/19 Javascript
详解微信小程序开发之——wx.showToast(OBJECT)的使用
2017/01/18 Javascript
bootstrap table操作技巧分享
2017/02/15 Javascript
webpack+vue2构建vue项目骨架的方法
2018/01/09 Javascript
利用angular自动编译andriod APK的绕坑经历分享
2019/03/08 Javascript
js 实现watch监听数据变化的代码
2019/10/13 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
谈一谈vue请求数据放在created好还是mounted里好
2020/07/27 Javascript
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
python日期相关操作实例小结
2019/06/24 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
2020/04/17 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
2020/09/11 Python
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
英国一家集合了众多有才华设计师品牌的奢侈店:Wolf & Badger
2018/04/18 全球购物
中专毕业生的自我鉴定
2013/12/01 职场文书
人事科岗位职责范本
2014/03/02 职场文书
高校教师岗位职责
2014/03/18 职场文书
品牌服务方案
2014/06/03 职场文书
工作经验交流材料
2014/12/30 职场文书