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 相关文章推荐
第三节--定义一个类
Nov 16 PHP
PHP中的cookie
Nov 26 PHP
MySQL数据源表结构图示
Jun 05 PHP
ThinkPHP中的常用查询语言汇总
Aug 22 PHP
Thinkphp中数据按分类嵌套循环实现方法
Oct 30 PHP
php面向对象中static静态属性和静态方法的调用
Feb 08 PHP
php中使用sftp教程
Mar 30 PHP
利用php输出不同的心形图案
Apr 22 PHP
一波PHP中cURL库的常见用法代码示例
May 06 PHP
如何打开php的gd2库
Feb 09 PHP
PHP性能分析工具xhprof的安装使用与注意事项
Dec 19 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 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的网址
2006/11/25 PHP
php下intval()和(int)转换使用与区别
2008/07/18 PHP
php两种无限分类方法实例
2015/04/21 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
如何在PHP环境中使用ProtoBuf数据格式
2020/06/19 PHP
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
详解JavaScript基于面向对象之创建对象(1)
2015/12/10 Javascript
JavaScript继承模式粗探
2016/01/12 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
javascript跨域请求包装函数与用法示例
2016/11/03 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
2017/02/17 Javascript
如何使用vuejs实现更好的Form validation?
2017/04/07 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
react配合antd组件实现的管理系统示例代码
2018/04/24 Javascript
修改vue+webpack run build的路径方法
2018/09/01 Javascript
JavaScript中十种一步拷贝数组的方法实例详解
2019/04/22 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
ES6中new Function()语法及应用实例分析
2020/02/19 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
如何运行Python程序的方法
2013/04/21 Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
python模块之re正则表达式详解
2017/02/03 Python
如何利用python查找电脑文件
2018/04/27 Python
python的常用模块之collections模块详解
2018/12/06 Python
python实现连续图文识别
2018/12/18 Python
python使用zip将list转为json的方法
2018/12/31 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
CSS3 Columns分列式布局方法简介
2014/05/03 HTML / CSS
html5触摸事件判断滑动方向的实现
2018/06/05 HTML / CSS
如何查看浏览器对html5的支持情况
2020/12/15 HTML / CSS
科长个人四风问题整改措施思想汇报
2014/10/13 职场文书
客房服务员岗位职责
2015/02/09 职场文书
如何用RabbitMQ和Swoole实现一个异步任务系统
2021/05/29 PHP
MySQL创建管理子分区
2022/04/13 MySQL