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 相关文章推荐
Windows7下PHP开发环境安装配置图文方法
May 20 PHP
PHP print类函数使用总结
Jun 25 PHP
PHP中使用CURL伪造来路抓取页面或文件
May 04 PHP
PHP 获取文件路径(灵活应用__FILE__)
Feb 15 PHP
php防止SQL注入详解及防范
Nov 12 PHP
两千行代码的PHP学习笔记汇总
Oct 05 PHP
PHP静态文件生成类实例
Nov 29 PHP
PHP动态规划解决0-1背包问题实例分析
Mar 23 PHP
PHP中的session安全吗?
Jan 22 PHP
php大小写转换函数(strtolower、strtoupper)用法介绍
Nov 17 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
Nov 21 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
May 06 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
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
2009/10/31 PHP
解析PHP中DIRECTORY_SEPARATOR,PATH_SEPARATOR两个常量的作用
2013/06/21 PHP
php GUID生成函数和类
2014/03/10 PHP
PHP遍历数组的方法汇总
2015/04/30 PHP
PHP中Closure类的使用方法及详解
2015/10/09 PHP
yii2.0框架数据库操作简单示例【添加,修改,删除,查询,打印等】
2020/04/13 PHP
Span元素的width属性无效果原因及解决方案
2010/01/15 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
javascript实现字符串反转的方法
2015/02/05 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
jQuery each函数源码分析
2016/05/25 Javascript
微信小程序之拖拽排序(代码分享)
2017/01/21 Javascript
JS传参及动态修改页面布局
2017/04/13 Javascript
H5图片压缩与上传实例
2017/04/21 Javascript
微信小程序 检查接口状态实例详解
2017/06/23 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
基于JavaScript实现新增内容滚动播放效果附完整代码
2017/08/24 Javascript
js断点调试经验分享
2017/12/08 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
解决vue的变量在settimeout内部效果失效的问题
2018/08/30 Javascript
urllib2自定义opener详解
2014/02/07 Python
基于python中的TCP及UDP(详解)
2017/11/06 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
python 修改本地网络配置的方法
2019/08/14 Python
python/Matplotlib绘制复变函数图像教程
2019/11/21 Python
浅谈pytorch池化maxpool2D注意事项
2020/02/18 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
2020/03/14 Python
优秀大学生推荐信范文
2013/11/28 职场文书
食品安全汇报材料
2014/08/18 职场文书
合伙经营协议书范本
2014/09/13 职场文书
场地使用证明模板
2014/10/25 职场文书
给老婆的检讨书1000字
2015/01/01 职场文书
2019餐饮行业创业计划书!
2019/06/27 职场文书
Go各时间字符串使用解析
2021/04/02 Golang
Pandas加速代码之避免使用for循环
2021/05/30 Python