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之COOKIE支持详解
Sep 20 PHP
PHP学习之正则表达式
Apr 17 PHP
php中将数组存到文件里的实现代码
Jan 19 PHP
php 注释规范
Mar 29 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
Apr 25 PHP
PHP生成sitemap.xml地图函数
Nov 13 PHP
php为字符串前后添加指定数量字符的方法
May 04 PHP
PHP函数import_request_variables()用法分析
Apr 02 PHP
PHP数据库处理封装类实例
Dec 24 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
PHP设计模式之单例模式定义与用法分析
Mar 26 PHP
laravel 时间格式转时间戳的例子
Oct 11 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遍历目录输出目录及其下的所有文件示例
2014/01/27 PHP
PHP实现服务器状态监控的方法
2014/12/09 PHP
php+mysqli预处理技术实现添加、修改及删除多条数据的方法
2015/01/30 PHP
PHP实现通用alert函数的方法
2015/03/11 PHP
YII框架模块化处理操作示例
2019/04/26 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
2019/12/13 PHP
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
JS教程:window.location使用方法的区别介绍
2013/10/04 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
nodejs中实现阻塞实例
2015/03/24 NodeJs
快速解决js动态改变dom元素属性后页面及时渲染的问题
2016/07/06 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
jQuery完成表单验证的实例代码(纯代码)
2017/09/30 jQuery
详解如何在vue项目中使用lodop打印插件
2018/09/27 Javascript
vue实现父子组件之间的通信以及兄弟组件的通信功能示例
2019/01/29 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python正则表达式使用经典实例
2016/06/21 Python
python的mysqldb安装步骤详解
2017/08/14 Python
Python中分支语句与循环语句实例详解
2018/09/13 Python
Python requests模块实例用法
2019/02/11 Python
详解Python中is和==的区别
2019/03/21 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
2019/06/13 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
jupyter 使用Pillow包显示图像时inline显示方式
2020/04/24 Python
Python实现文件压缩和解压的示例代码
2020/08/12 Python
CSS3使用transition属性实现过渡效果
2018/04/18 HTML / CSS
工程总经理工作职责
2013/12/09 职场文书
演讲稿开场白
2014/01/13 职场文书
大学毕业生个人自荐书
2014/07/02 职场文书
爱护公共设施倡议书
2014/08/29 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
2015年物资管理工作总结
2015/05/20 职场文书
大学生社区义工服务心得体会
2016/01/22 职场文书