编写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生成zip压缩文件的方法详解
Jun 09 PHP
php中mysql连接和基本操作代码(快速测试使用,简单方便)
Apr 25 PHP
PHP集成百度Ueditor 1.4.3
Nov 23 PHP
php通过ksort()函数给关联数组按照键排序的方法
Mar 18 PHP
PHP基于工厂模式实现的计算器实例
Jul 16 PHP
PHP格式化MYSQL返回float类型的方法
Mar 30 PHP
php简单统计在线人数的方法
May 10 PHP
PHP线程的内存回收问题
Jul 08 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
Feb 05 PHP
详解PHP防止盗链防止迅雷下载的方法
Apr 26 PHP
PHP工厂模式的日常使用
Mar 20 PHP
PHP实现微信提现功能(微信商城)
Nov 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
初探PHP5
2006/10/09 PHP
php处理restful请求的路由类分享
2014/02/27 PHP
如何实现php图片等比例缩放
2015/07/28 PHP
PHP+MySql+jQuery实现的&quot;顶&quot;和&quot;踩&quot;投票功能
2016/05/21 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
js实现的切换面板实例代码
2013/06/17 Javascript
jquery $.fn $.fx是什么意思有什么用
2013/11/04 Javascript
Javascript遍历table中的元素示例代码
2014/07/08 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
2014/11/28 Javascript
轻松学习Javascript闭包函数
2015/12/15 Javascript
JavaScript的模块化开发框架Sea.js上手指南
2016/05/12 Javascript
AngularJS中的DOM操作用法分析
2016/11/04 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
js实现水平滚动菜单导航
2017/07/21 Javascript
微信小程序wx.previewImage预览图片实例详解
2017/12/07 Javascript
详解Angular5 服务端渲染实战
2018/01/04 Javascript
详解如何在微信小程序中愉快地使用sass
2018/07/30 Javascript
javascript json字符串到json对象转义问题
2019/01/22 Javascript
layui实现数据表格自定义数据项
2019/10/26 Javascript
node.js中 mysql 增删改查操作及async,await处理实例分析
2020/02/11 Javascript
Python2.x版本中maketrans()方法的使用介绍
2015/05/19 Python
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
Pycharm设置utf-8自动显示方法
2019/01/17 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
Python实现Singleton模式的方式详解
2019/08/08 Python
wxPython实现整点报时
2019/11/18 Python
应届生财务会计求职信
2013/11/05 职场文书
客服文员岗位职责
2013/11/29 职场文书
天猫活动策划方案
2014/08/21 职场文书
2014年实习期工作总结
2014/11/27 职场文书
七一晚会主持词
2015/06/29 职场文书
餐馆开业致辞
2015/08/01 职场文书
零基础学java之循环语句的使用
2022/04/10 Java/Android
Nginx反向代理、重定向
2022/04/13 Servers