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 相关文章推荐
PHP聊天室技术
Oct 09 PHP
php提交表单时判断 if($_POST[submit])与 if(isset($_POST[submit])) 的区别
Feb 08 PHP
php _autoload自动加载类与机制分析
Feb 10 PHP
PHP中::、-&amp;gt;、self、$this几种操作符的区别介绍
Apr 24 PHP
常用PHP框架功能对照表
Oct 23 PHP
PHP获取二维数组中某一列的值集合
Dec 25 PHP
Yii的Srbac插件用法详解
Jul 14 PHP
利用php生成验证码
Feb 23 PHP
php解析mht文件转换成html的实例
Mar 13 PHP
Laravel模型间关系设置分表的方法示例
Apr 21 PHP
PHP使用XMLWriter读写xml文件操作详解
Jul 31 PHP
TP5框架页面跳转样式操作示例
Apr 05 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 长文章分页函数 带使用方法,不会分割段落,翻页在底部
2009/10/22 PHP
php短址转换实现方法
2015/02/25 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
php+mysql实现无限级分类
2015/11/11 PHP
不错的asp中显示新闻的功能
2006/10/13 Javascript
JavaScript 原型与继承说明
2010/06/09 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
2013/06/09 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
node.js中格式化数字增加千位符的几种方法
2015/07/03 Javascript
jQuery插件实现无缝滚动特效
2015/11/24 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
jQuery Ajax File Upload实例源码
2016/12/12 Javascript
JavaScript Ajax实现异步通信
2016/12/14 Javascript
webpack的CSS加载器的使用
2018/09/11 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
2019/05/23 jQuery
vue中v-show和v-if的异同及v-show用法
2019/06/06 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
pygame学习笔记(4):声音控制
2015/04/15 Python
python检测IP地址变化并触发事件
2018/12/26 Python
pandas DataFrame索引行列的实现
2019/06/04 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
2019/08/09 Python
Python使用matplotlib绘制三维参数曲线操作示例
2019/09/10 Python
解决django框架model中外键不落实到数据库问题
2020/05/20 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
真正了解CSS3背景下的@font face规则
2017/05/04 HTML / CSS
Farfetch美国:奢侈品牌时尚购物平台
2019/05/02 全球购物
阿拉伯书店:Jamalon
2019/07/24 全球购物
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
回门宴父母答谢词
2014/01/26 职场文书
优秀团员事迹材料1000字
2014/08/20 职场文书
2015年乡镇民政工作总结
2015/05/13 职场文书
《刺客之王:C罗全景传记》:时代从来不会亏待手艺人
2019/11/28 职场文书