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 检查扩展库或函数是否可用的代码
Apr 06 PHP
PHP array操作10个小技巧分享
Jun 23 PHP
PHPWind与Discuz截取字符函数substrs与cutstr性能比较
Dec 05 PHP
基于flush()不能按顺序输出时的解决办法
Jun 29 PHP
Fedora下安装php Redis扩展笔记
Sep 03 PHP
php实现使用正则将文本中的网址转换成链接标签
Dec 03 PHP
php+ajax实现无刷新数据分页的办法
Nov 02 PHP
WordPress用户登录框密码的隐藏与部分显示技巧
Dec 31 PHP
利用php做服务器和web前端的界面进行交互
Oct 31 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
PHP中quotemeta()函数的用法讲解
Apr 04 PHP
laravel按天、按小时,查询数据的实例
Oct 09 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
玩转图像函数库―常见图形操作
2006/09/03 PHP
从一个不错的留言本弄的mysql数据库操作类
2007/09/02 PHP
php preg_match_all结合str_replace替换内容中所有img
2008/10/11 PHP
PHP实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
CodeIgniter安全相关设置汇总
2014/07/03 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
dwz 如何去掉ajaxloading具体代码
2013/05/22 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
2013/07/29 Javascript
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
JS实现可直接显示网页代码运行效果的HTML代码预览功能实例
2015/08/06 Javascript
javascript弹出拖动窗口
2015/08/11 Javascript
jQuery+css实现的tab切换标签(兼容各浏览器)
2016/01/28 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
2016/02/02 Javascript
bootstrap监听滚动实现头部跟随滚动
2016/11/08 Javascript
jquery实现多次上传同一张图片
2017/01/09 Javascript
移动端手指放大缩小插件与js源码
2017/05/22 Javascript
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
js实现页面导航层级指示效果
2020/08/25 Javascript
Python使用lxml模块和Requests模块抓取HTML页面的教程
2016/05/16 Python
python图片验证码生成代码
2016/07/02 Python
python基于plotly实现画饼状图代码实例
2019/12/16 Python
Window系统下Python如何安装OpenCV库
2020/03/05 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
安装python3.7编译器后如何正确安装opnecv的方法详解
2020/06/16 Python
python和php哪个更适合写爬虫
2020/06/22 Python
WebSphere 应用服务器都支持哪些认证
2013/12/26 面试题
经典C++面试题一
2016/11/06 面试题
.TTL是什么?有什么用处,通常那些工具会用到它?(ping? traceroute? ifconfig? netstat?)
2016/05/09 面试题
Java Servlet的主要功能和作用是什么
2014/02/14 面试题
学生发电厂实习自我鉴定
2013/09/22 职场文书
党支部公开承诺践诺书
2014/03/28 职场文书
网络工程师自荐书范文
2014/04/01 职场文书
社会学专业求职信
2014/07/17 职场文书
普通党员四风问题对照检查材料
2014/09/27 职场文书
党员干部四风问题整改措施思想汇报
2014/10/12 职场文书
老公保证书
2015/01/17 职场文书