使用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令牌 Token改进版
Jul 18 PHP
PHP版国家代码、缩写查询函数代码
Aug 14 PHP
php添加文章时生成静态HTML文章的实现代码
Feb 17 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
Jul 10 PHP
PHP实现HTTP断点续传的方法
Jun 17 PHP
php实现的农历算法实例
Aug 11 PHP
[原创]php简单防盗链验证实现方法
Jul 09 PHP
php5.3后静态绑定用法详解
Nov 11 PHP
Laravel5.* 打印出执行的sql语句的方法
Jul 24 PHP
PHP设计模式之原型设计模式原理与用法分析
Apr 25 PHP
laravel中的一些简单实用功能
Nov 03 PHP
PHP实现简单日历类编写
Aug 28 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
火车头采集器3.0采集图文教程
2007/03/17 PHP
php 文件状态缓存带来的问题
2008/12/14 PHP
利用PHPExcel实现Excel文件的写入和读取
2017/04/26 PHP
php表单处理操作
2017/11/16 PHP
准确获得页面、窗口高度及宽度的JS
2006/11/26 Javascript
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
js实现目录定位正文示例
2013/11/14 Javascript
在jquery boxy中添加百度地图坐标拾取注意流程
2014/04/03 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
node.js学习之base64编码解码
2016/10/21 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
2017/01/04 Javascript
JavaScript切换搜索引擎的导航网页搜索框实例代码
2017/06/11 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
详解wepy开发小程序踩过的坑(小结)
2019/05/22 Javascript
微信小程序中button去除默认的边框实例代码
2019/08/01 Javascript
vue 实现移动端键盘搜索事件监听
2019/11/06 Javascript
[00:32]2018DOTA2亚洲邀请赛iG出场
2018/04/03 DOTA
Python入门篇之面向对象
2014/10/20 Python
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
Python实现运行其他程序的四种方式实例分析
2017/08/17 Python
Python3导入自定义模块的三种方法详解
2018/04/13 Python
对pandas数据判断是否为NaN值的方法详解
2018/11/06 Python
python之当你发现QTimer不能用时的解决方法
2019/06/21 Python
如何在Django中使用聚合的实现示例
2020/03/23 Python
python进行参数传递的方法
2020/05/12 Python
浅析Python 序列化与反序列化
2020/08/05 Python
泰国折扣酒店预订:Hotels2Thailand
2018/03/20 全球购物
医院护理人员的自我评价分享
2013/10/04 职场文书
手术室护士自我鉴定
2013/10/14 职场文书
大学生党员批评与自我批评
2014/09/28 职场文书
Python 内置函数速查表一览
2021/06/02 Python
Vue实现导入Excel功能步骤详解
2021/07/03 Vue.js
HTML实现仿Windows桌面主题特效的实现
2022/06/28 HTML / CSS
SpringBoot项目部署到阿里云服务器的实现步骤
2022/06/28 Java/Android