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之第四天
Oct 09 PHP
解析php常用image图像函数集
Jun 24 PHP
php 批量替换html标签的实例代码
Nov 26 PHP
一个PHP二维数组排序的函数分享
Jan 17 PHP
php异步多线程swoole用法实例
Nov 14 PHP
THINKPHP支持YAML配置文件的设置方法
Mar 17 PHP
Yii2验证器(Validator)用法分析
Jul 23 PHP
PHP将字符串首字母大小写转换的实例
Jan 21 PHP
thinkPHP框架中执行原生SQL语句的方法
Oct 25 PHP
PHP实现微信退款功能
Oct 02 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
Oct 15 PHP
laravel使用数据库测试注意事项
Apr 10 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
laravel5实现微信第三方登录功能
2018/12/06 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
2019/09/12 PHP
关于js类的定义
2011/06/28 Javascript
JS如何将UTC格式时间转本地格式
2013/09/04 Javascript
用jquery修复在iframe下的页面锚点失效问题
2014/08/22 Javascript
AngularJS HTML编译器介绍
2014/12/06 Javascript
JavaScript前端图片加载管理器imagepool使用详解
2014/12/29 Javascript
浅谈angular.js中实现双向绑定的方法$watch $digest $apply
2015/10/14 Javascript
jQuery滚动新闻实现代码
2016/06/26 Javascript
进阶之初探nodeJS
2017/01/24 NodeJs
基于JavaScript实现滑动门效果
2017/03/16 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
自定义vue组件发布到npm的方法
2018/05/09 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
2018/11/04 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
2020/07/24 Javascript
基于vue--key值的特殊用处详解
2020/07/31 Javascript
各个系统下的Python解释器相关安装方法
2015/10/12 Python
Python连接mysql数据库的正确姿势
2016/02/03 Python
TensorFlow实现创建分类器
2018/02/06 Python
Python定义一个跨越多行的字符串的多种方法小结
2018/07/19 Python
如何利用Boost.Python实现Python C/C++混合编程详解
2018/11/08 Python
python实现雪花飘落效果实例讲解
2019/06/18 Python
Python 简单计算要求形状面积的实例
2020/01/18 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
2021/02/25 Python
CSS3 实现侧边栏展开收起动画
2014/12/22 HTML / CSS
澳大利亚珍珠首饰购物网站:Vayo Pearls
2019/03/11 全球购物
外企办公室竞聘演讲稿
2013/12/29 职场文书
2014年教师培训的自我评价
2014/01/03 职场文书
打架检讨书100字
2014/01/08 职场文书
优秀士兵先进事迹
2014/02/06 职场文书
公务员平时考核实施方案
2014/03/11 职场文书
公司周年庆典策划方案
2014/05/17 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
高中16字霸气押韵班级口号集锦!
2019/06/27 职场文书