使用PHP模拟HTTP认证


Posted in PHP onOctober 09, 2006

如果你希望在每个脚本的基础上实现口令保护功能,那么你可以通过结合header()函数和$PHP_AUTH_USER、$PHP_AUTH_PW全局变量的方法来创建一个基本认证机制。通常基于服务器的认证请求/响应过程如下:

 
1. 用户向一台Web服务器请求一个文件。如果文件在一个受到保护的区域以内,服务器就在响应数据的头部内加上401(非法用户)字符串作为回应。

2.浏览器看见该响应之后弹出用户名/口令对话框。

3.用户在对话框中输入用户名和口令,然后单击“OK”把这些信息送回到服务器进行认证。

4. 如用户名及口令有效,被保护的文件将会显示给用户。该确认将在经证实的用户在保护区域内的时间里持续有效。 

一个简单的PHP脚本可以通过发送适当的HTTP头以在客户机屏幕自动显示用户名/口令对话框以模拟HTTP认证请求/响应系统。PHP将用户输入对话框的信息存储在$PHP_AUTH_USER和$PHP_AUTH_PW变量中。通过使用这些变量,可以把不符合用户名/口令检验的列表存放到某个文本文件、数据库或者你希望的任何地方。

注意:$PHP_AUTH_USER、$PHP_AUTH_PW和$PHP_AUTH_TYPE全局变量仅当PHP被当作一个模块安装时才是有效的。如正使用PHP的CGI版本,则将仅限于使用基于htaccess认证或基于数据库的认证方式,并通过HTML表单让用户输入用户名和口令,然后再让PHP完成有效性的检查。

本例显示对两个硬件编码值的确认检查,不论用户名和口令存放在何处,这在理论上完全相同。

<?

/* 检查变量 $PHP_AUTH_USER 和$PHP_AUTH_PW 的值*/

if ((!isset($PHP_AUTH_USER)) || (!isset($PHP_AUTH_PW))) {

 /* 空值:发送产生显示文本框的数据头部*/

    header('WWW-Authenticate: Basic realm="My Private Stuff"');

    header('HTTP/1.0 401 Unauthorized');

    echo 'Authorization Required.';

    exit;

} else if ((isset($PHP_AUTH_USER)) && (isset($PHP_AUTH_PW))){

    /* 变量值存在,检查其是否正确 */

    if (($PHP_AUTH_USER != "validname") || ($PHP_AUTH_PW != "goodpassword")) {

/* 用户名输入错误或密码输入错误,发送产生显示文本框的数据头部*/

       header('WWW-Authenticate: Basic realm="My Private Stuff"');

       header('HTTP/1.0 401 Unauthorized');

       echo 'Authorization Required.';

       exit;

    } else if (($PHP_AUTH_USER == "validname") || ($PHP_AUTH_PW == "goodpassword")) {

      /* 用户名及密码都正确,输出成功信息 */

       echo "<P>You're authorized!</p>";

    }

}

?>

必须提醒,当你正在使用基于文件的保护时,此方式并不能对目录提供全方位的安全保障。。这对大多数人而言是很明显的,但是,如果你的大脑在弹出对话框和保护给定目录二者之间建立一个连接,你应该对此进行进一步的考虑。。

Julie Meloni 是i2i Interactive的技术主管,及Linux和开放源代码社区的大力推动者。她撰写了很多关于PHP及其他技术的书籍,并成为对CNET Builder.com具有长期贡献的专家。

 

PHP 相关文章推荐
PHP中使用crypt()实现用户身份验证的代码
Sep 05 PHP
php获取用户IPv4或IPv6地址的代码
Nov 15 PHP
跟我学Laravel之路由
Oct 15 PHP
CI框架学习笔记(二) -入口文件index.php
Oct 27 PHP
PHP处理postfix邮件内容的方法
Jun 16 PHP
Zend Framework动作助手FlashMessenger用法详解
Mar 05 PHP
PHP模板引擎Smarty中的保留变量用法分析
Apr 11 PHP
PHP中call_user_func_array回调函数的用法示例
Nov 26 PHP
php数组指针操作详解
Feb 14 PHP
CakePHP框架Session设置方法分析
Feb 23 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
Mar 23 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
Jul 19 PHP
在PHP中使用XML
Oct 09 #PHP
使用PHP维护文件系统
Oct 09 #PHP
跟我学小偷程序之成功偷取首页(第三天)
Oct 09 #PHP
在apache下限制每个虚拟主机的并发数!!!!
Oct 09 #PHP
PHP4之真OO
Oct 09 #PHP
第十一节 重载 [11]
Oct 09 #PHP
第十二节 类的自动加载 [12]
Oct 09 #PHP
You might like
vBulletin Forum 2.3.xx SQL Injection
2006/10/09 PHP
php xml常用函数的集合(比较详细)
2013/06/06 PHP
PHP实现定时执行任务的方法
2014/10/05 PHP
php几个预定义变量$_SERVER用法小结
2014/11/07 PHP
如何使用php等比例缩放图片
2016/10/12 PHP
Yii框架学习笔记之应用组件操作示例
2019/11/13 PHP
你所要知道JS(DHTML)中的一些技巧
2007/01/09 Javascript
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
jquery 插件学习(三)
2012/08/06 Javascript
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
2014/03/18 NodeJs
JS实现图片延迟加载并淡入淡出效果的简单方法
2016/08/25 Javascript
Angular2 Service实现简单音乐播放器服务
2017/02/24 Javascript
基于JavaScript 性能优化技巧心得(分享)
2017/12/11 Javascript
使用JS获取SessionStorage的值
2018/01/12 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
vue插槽slot的理解和使用方法
2019/04/03 Javascript
Vue 数组和对象更新,但是页面没有刷新的解决方式
2019/11/09 Javascript
vue-quill-editor的使用及个性化定制操作
2020/08/04 Javascript
python脚本实现xls(xlsx)转成csv
2016/04/10 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
python scatter函数用法实例详解
2020/02/11 Python
加拿大最大的书店:Indigo
2017/01/01 全球购物
开办饭店创业计划书
2013/12/28 职场文书
技校毕业生个人学习的自我评价
2014/02/21 职场文书
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
运动会口号大全
2014/06/07 职场文书
学校学习雷锋活动总结
2014/07/03 职场文书
党员一帮一活动总结
2014/07/08 职场文书
学校周年庆活动方案
2014/08/22 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
导游词之藏龙百瀑景区
2019/12/30 职场文书
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
2021/03/31 jQuery
基于python制作简易版学生信息管理系统
2021/04/20 Python
Python打包为exe详细教程
2021/05/18 Python
Java的Object类的九种方法
2022/04/13 Java/Android