PHP脚本的10个技巧(5)


Posted in PHP onOctober 09, 2006

采用PHP的用户认证
如果你希望在每一个脚本的基础上实现口令保护功能,那么你可以联合使用header()函数和$PHP_AUTH_USER、$PHP_AUTH_PW全局变量来创造一个基本的认证方案。通常的、基于服务器的认证请求/响应回合很象下面这个样子:

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

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

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

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进行有效性的检查。

下面的这个例子显示对2个设定值的检查,但在理论上和以上的用户名和口令检查并无本质的不同。

<?
/* Check for values in $PHP_AUTH_USER and $PHP_AUTH_PW */

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

  /* No values: send headers causing dialog box to appear */
  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))){

  /* Values contain some values, so check to see if they're correct */

  if (($PHP_AUTH_USER != "validname") || ($PHP_AUTH_PW != "goodpassword")) {
    /* If either the username entered is incorrect, or the password entered is incorrect, send the headers causing dialog box to appear */
    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")) {
    /* if both values are correct, print success message */
    echo "<P>You're authorized!</p>";
  }
}
?>

记住,当你正在使用基于文件的保护措施时,这种方式不是绝对能保护目录的安全毯。这对你们中的大多数人而言是显而易见的,但是,如果你的大脑在弹出对话框之间和保护给定目录之间建立一个连接,那么你必须费点劲来认识这一进程。

PHP 相关文章推荐
用文本文件制作留言板提示(下)
Oct 09 PHP
PHP中文件上传的一个问题
Sep 04 PHP
php 文件上传类代码
Aug 06 PHP
解析PHP计算页面执行时间的实现代码
Jun 18 PHP
6种php上传图片重命名的方法实例
Nov 04 PHP
PHP mail()函数使用及配置方法
Jan 14 PHP
php日历制作代码分享
Jan 20 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 PHP
你可能不知道PHP get_meta_tags()函数
May 12 PHP
php基于数组函数实现关联表的编辑操作示例
Jul 04 PHP
php把字符串指定字符分割成数组的方法
Mar 12 PHP
Thinkphp5框架实现图片、音频和视频文件的上传功能详解
Aug 27 PHP
打造计数器DIY三步曲(中)
Oct 09 #PHP
打造计数器DIY三步曲(下)
Oct 09 #PHP
打造计数器DIY三步曲(上)
Oct 09 #PHP
PHP脚本的10个技巧(4)
Oct 09 #PHP
聊天室php&amp;mysql(六)
Oct 09 #PHP
PHP脚本的10个技巧(3)
Oct 09 #PHP
社区(php&amp;&amp;mysql)六
Oct 09 #PHP
You might like
PHP产生不重复随机数的5个方法总结
2014/11/12 PHP
php猴子选大王问题解决方法
2015/05/12 PHP
jQuery 1.3 和 Validation 验证插件1.5.1
2009/07/09 Javascript
Prototype Class对象学习
2009/07/19 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
2011/09/26 Javascript
js保留两位小数使用toFixed实现
2013/07/29 Javascript
浅谈JavaScript中运算符的优先级
2015/07/07 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
2016/08/26 Javascript
在使用JSON格式处理数据时应该注意的问题小结
2017/05/20 Javascript
vue表单验证你真的会了吗?vue表单验证(form)validate
2019/04/07 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
详解vue beforeEach 死循环问题解决方法
2020/02/25 Javascript
javascript实现简易数码时钟
2020/03/30 Javascript
JS 数组和对象的深拷贝操作示例
2020/06/06 Javascript
[03:03]2014DOTA2西雅图国际邀请赛 Alliance战队巡礼
2014/07/07 DOTA
[46:03]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
python使用opencv按一定间隔截取视频帧
2018/03/06 Python
Python绘制3D图形
2018/05/03 Python
django中模板的html自动转意方法
2018/05/27 Python
Python实现识别图片内容的方法分析
2018/07/11 Python
python实现websocket的客户端压力测试
2019/06/25 Python
tensorflow 报错unitialized value的解决方法
2020/02/06 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
HTML5移动端手机网站开发流程
2016/04/25 HTML / CSS
写自荐信要注意什么
2013/12/26 职场文书
文明家庭先进事迹材
2014/01/27 职场文书
学生安全责任书
2014/04/15 职场文书
护士感人事迹
2014/05/01 职场文书
《中国梦我的梦》大学生演讲稿
2014/08/20 职场文书
卫生主题班会
2015/08/14 职场文书
一小时迅速入门Mybatis之bind与多数据源支持 Java API
2021/09/15 Javascript
在CSS中使用when/else的方法
2022/01/18 HTML / CSS
一文教你快速生成MySQL数据库关系图
2022/06/28 Redis