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 相关文章推荐
PHP6 先修班 JSON实例代码
Aug 23 PHP
PHP 错误之引号中使用变量
May 04 PHP
Views rows style模板重写代码
May 16 PHP
PHP跳转页面的几种实现方法详解
Jun 08 PHP
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
May 07 PHP
PHP实现多图片上传类实例
Jul 26 PHP
php单例模式示例分享
Feb 12 PHP
linux下实现定时执行php脚本
Feb 13 PHP
学习php设计模式 php实现原型模式(prototype)
Dec 07 PHP
PHP 中使用explode()函数切割字符串为数组的示例
May 06 PHP
Laravel5框架添加自定义辅助函数的方法
Aug 01 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
Feb 16 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/19 PHP
安装APACHE
2007/01/15 PHP
php 读取shell管道传输过来的内容
2010/03/01 PHP
smarty 缓存控制前的页面静态化原理
2013/03/15 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
phalcon框架使用指南
2016/02/23 PHP
Javascript中的数学函数集合
2007/05/08 Javascript
javascript三元运算符用法实例
2015/04/16 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
HTML Table 空白单元格补全的简单实现
2016/10/13 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
js实现获取鼠标当前的位置
2016/12/14 Javascript
JavaScript 事件对内存和性能的影响
2017/01/22 Javascript
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
JavaScript中BOM对象原理与用法分析
2019/07/09 Javascript
layer实现弹出层自动调节位置
2019/09/05 Javascript
js观察者模式的弹幕案例
2020/11/23 Javascript
python实现文件路径和url相互转换的方法
2015/07/06 Python
举例讲解Django中数据模型访问外键值的方法
2015/07/21 Python
Python 装饰器实现DRY(不重复代码)原则
2018/03/05 Python
关于python2 csv写入空白行的问题
2018/06/22 Python
Python 字符串与二进制串的相互转换示例
2018/07/23 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
大家都说好用的Python命令行库click的使用
2019/11/07 Python
python颜色随机生成器的实例代码
2020/01/10 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
2020/04/01 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
CSS3 开发工具收集
2010/04/17 HTML / CSS
CSS3的calc()做响应模式布局的实现方法
2017/09/06 HTML / CSS
独特的礼品和创新的科技产品:The Grommet
2018/02/24 全球购物
《美丽的黄昏》教学反思
2014/02/28 职场文书
《凡卡》教学反思
2014/04/09 职场文书
人力资源管理毕业求职信
2014/08/05 职场文书
2015年元宵节活动总结
2015/02/06 职场文书
Matplotlib绘制混淆矩阵的实现
2021/05/27 Python
二维码条形码生成的JavaScript脚本库
2022/07/07 Javascript