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实现多服务器session共享之NFS共享的方法
Mar 16 PHP
php radio 单选框获取与保持值的实现代码
May 15 PHP
PHP 文件编程综合案例-文件上传的实现
Jul 03 PHP
ajax返回值中有回车换行、空格的解决方法分享
Oct 24 PHP
phpmyadmin打开很慢的解决方法
Apr 21 PHP
ThinkPHP3.1新特性之对Ajax的支持更加完善
Jun 19 PHP
wampserver改变默认网站目录的办法
Aug 05 PHP
教大家制作简单的php日历
Nov 17 PHP
php获取网站根目录物理路径的几种方法(推荐)
Mar 04 PHP
PHP实现git部署的方法教程
Dec 19 PHP
使用laravel和ajax实现整个页面无刷新的操作方法
Oct 03 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
Apr 07 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 面向对象 final类与final方法
2010/05/05 PHP
javascript+php实现根据用户时区显示当地时间的方法
2015/03/11 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
2018/06/19 PHP
Javascript 的addEventListener()及attachEvent()区别分析
2009/05/21 Javascript
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
js 针对html DOM元素操作等经验累积
2014/03/11 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
微信小程序 tabs选项卡效果的实现
2017/01/05 Javascript
js实现ATM机存取款功能
2020/10/27 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
微信小程序select下拉框实现源码
2019/11/08 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
[04:31]2016国际邀请赛中国区预选赛妖精采访
2016/06/27 DOTA
一个检测OpenSSL心脏出血漏洞的Python脚本分享
2014/04/10 Python
Python使用正则表达式获取网页中所需要的信息
2018/01/29 Python
Python中的defaultdict与__missing__()使用介绍
2018/02/03 Python
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
python 多线程重启方法
2019/02/18 Python
pandas实现将日期转换成timestamp
2019/12/07 Python
python实现QQ邮箱发送邮件
2020/03/06 Python
python利用platform模块获取系统信息
2020/10/09 Python
Genny意大利官网:意大利高级时装品牌
2020/04/15 全球购物
Perfume’s Club美国官网:西班牙第一家在线美容店
2020/06/10 全球购物
大一学生假期实习的自我评价
2013/10/12 职场文书
大学生求职自荐信
2013/12/12 职场文书
列车长先进事迹材料
2014/01/25 职场文书
消防安全责任书
2014/04/14 职场文书
社区志愿者活动方案
2014/08/18 职场文书
公司演讲稿开场白
2014/08/25 职场文书
私营公司诉讼代理委托书范本
2014/09/13 职场文书
2015年大学生实习评语
2015/03/25 职场文书
Python开发之QT解决无边框界面拖动卡屏问题(附带源码)
2021/05/27 Python
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android
javascript遍历对象的五种方式实例代码
2021/10/24 Javascript