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 相关文章推荐
一个ORACLE分页程序,挺实用的.
Oct 09 PHP
使用apache模块rewrite_module (转)
Feb 14 PHP
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
Aug 26 PHP
PHP中$_FILES的使用方法及注意事项说明
Feb 14 PHP
PHP处理Json字符串解码返回NULL的解决方法
Sep 01 PHP
ThinkPHP中自定义错误页面和提示页面实例
Nov 22 PHP
php常用表单验证类用法实例
Jun 18 PHP
php防止CC攻击代码 php防止网页频繁刷新
Dec 21 PHP
php实现保存周期为1天的购物车类
Jul 07 PHP
PHP编程实现计算抽奖概率算法完整实例
Aug 09 PHP
PHP实现链表的定义与反转功能示例
Jun 09 PHP
PHP策略模式写法
Apr 01 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 引用(&amp;)详解
2009/11/20 PHP
浅析十款PHP开发框架的对比
2013/07/05 PHP
CI框架学习笔记(二) -入口文件index.php
2014/10/27 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
tp5递归 无限级分类详解
2019/10/18 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
js精度溢出解决方案
2012/12/02 Javascript
js 控制页面跳转的5种方法
2013/09/09 Javascript
NodeJS的url截取模块url-extract的使用实例
2013/11/18 NodeJs
单击和双击事件的冲突处理示例代码
2014/04/03 Javascript
jquery实现图片随机排列的方法
2015/05/04 Javascript
一道关于JavaScript变量作用域的面试题
2016/03/08 Javascript
深入了解JavaScript的逻辑运算符(与、或)
2016/12/20 Javascript
Bootstrap表单使用方法详解
2017/02/17 Javascript
js评分组件使用详解
2017/06/06 Javascript
浅谈js的解析顺序 作用域 严格模式
2017/10/23 Javascript
react学习笔记之state以及setState的使用
2017/12/07 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
2018/10/01 Javascript
js实现select下拉框选择
2020/01/11 Javascript
React Hooks 实现和由来以及解决的问题详解
2020/01/17 Javascript
JS实现电脑虚拟键盘的操作
2020/06/24 Javascript
如何通过vscode运行调试javascript代码
2020/07/24 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
浅谈Python中函数的参数传递
2016/06/21 Python
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
python将list转为matrix的方法
2018/12/12 Python
详解Python 4.0 预计推出的新功能
2019/07/26 Python
Python中sys模块功能与用法实例详解
2020/02/26 Python
python 浮点数四舍五入需要注意的地方
2020/08/18 Python
python自动化测试三部曲之unittest框架的实现
2020/10/07 Python
使用canvas绘制超炫时钟
2014/12/17 HTML / CSS
Python实现拼音转换
2021/06/07 Python
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python
OpenCV-Python实现轮廓的特征值
2021/06/09 Python
Python find()、rfind()方法及作用
2022/12/24 Python