0

0

php 基于表单密码验证与HTTP验证用法

php中文网

php中文网

发布时间:2016-05-25 16:57:51

|

1167人浏览过

|

来源于php中文网

原创

php 的 http 认证机制仅在 php 以 apache 模块方式运行时才有效,因此该功能不适用于 cgi 版本。在 apache 模块的 php 脚本中,可以用 header() 函数来向客户端浏览器发送"authentication required"信息,使其弹出一个用户名/密码输入窗口。当用户输入用户名和密码后,包含有 url 的 php 脚本将会加上 预定义变量 php_auth_user , php_auth_pw 和 auth_type 被再次调用,这三个变量分别被设定为用户名,密码和认证类型。预定义变量保存在 $_server 或者 $http_server_vars 数组中。支持"basic"和"digest"(自 php 5.1.0 起)认证方法。请参阅 header() 函数以获取更多信息。

PHP 版本问题: Autoglobals 全局变量,包括 $_SERVER 等,自 PHP 4.1.0 起有效, $HTTP_SERVER_VARS 从 PHP 3 开始有效。

以下是在页面上强迫客户端认证的脚本范例.

例子 34-1. Basic HTTP 认证范例

<?php 
if (!isset( $_SERVER [ 'PHP_AUTH_USER' ])) {  
    header ( 'WWW-Authenticate: Basic realm="My Realm"' );  
    header ( 'HTTP/1.0 401 Unauthorized' );  
    echo 'Text to send if user hits Cancel button' ;  
    exit; 
} else {  
    echo "<p>Hello { $_SERVER [ 'PHP_AUTH_USER' ]} .</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p>" ;  
    echo "<p>You entered { $_SERVER [ 'PHP_AUTH_PW' ]} as your password.</p>" ;  
}

例子 34-2. Digest HTTP 认证范例

本例演示怎样实现一个简单的 Digest HTTP 认证脚本,更多信息请参考 RFC 2617.

<?php  
$realm = 'Restricted area' ; 
//user => password  
$users = array( 'admin' => 'mypass' , 'guest' => 'guest' ); 
 
if (!isset( $_SERVER [ 'PHP_AUTH_DIGEST' ])) {  
     header ( 'HTTP/1.1 401 Unauthorized' );  
     header ( 'WWW-Authenticate: Digest realm="' . $realm .  
            '" qop="auth" nonce="' . uniqid (). '" opaque="' . md5 ( $realm ). '"' ); 
    die( 'Text to send if user hits Cancel button' );  
} 
// analize the PHP_AUTH_DIGEST variable  
preg_match ( '/username="(?P<username>.*)",s*realm="(?P<realm>.*)",s*nonce="(?P<nonce>.*)",s*uri="(?P<uri>.*)",s*response="(?P<response>.*)",s*opaque="(?P<opaque>.*)",s*qop=(?P<qop>.*),s*nc=(?P<nc>.*),s*cnonce="(?P<cnonce>.*)"/' , $_SERVER [ 'PHP_AUTH_DIGEST' ], $digest ); 
if (!isset( $users [ $digest [ 'username' ]]))  
    die( 'Username not valid!' ); 
 
// generate the valid response  
$A1 = md5 ( $digest [ 'username' ] . ':' . $realm . ':' . $users [ $digest [ 'username' ]]);  
$A2 = md5 ( $_SERVER [ 'REQUEST_METHOD' ]. ':' . $digest [ 'uri' ]);  
$valid_response = md5 ( $A1 . ':' . $digest [ 'nonce' ]. ':' . $digest [ 'nc' ]. ':' . $digest [ 'cnonce' ]. ':' . $digest [ 'qop' ]. ':' . $A2 ); 
if ( $digest [ 'response' ] != $valid_response )  
    die( 'Wrong Credentials!' ); 
// ok, valid username & password  
echo 'Your are logged in as: ' . $digest [ 'username' ];

兼容性问题:在编写 HTTP 标头代码时请格外小心,为了对所有的客户端保证兼容性,关键字"Basic"的第一个字母必须大写为"B",分界字符串必须用双引号(不是单引号)引用;并且在标头行 HTTP/1.0 401 中,在 401 前必须有且仅有一个空格.

在以上例子中,仅仅只打印出了 PHP_AUTH_USER 和 PHP_AUTH_PW 的值,但在实际运用中,可能需要对用户名和密码的合法性进行检查,或许进行数据库教程的查询,或许从 dbm 文件中检索.

注意有些 Internet Explorer 浏览器本身有问题。它对标头的顺序显得似乎有点吹毛求疵。目前看来在发送 HTTP/1.0 401 之前先发送 WWW-Authenticate 标头似乎可以解决此问题。

自 PHP 4.3.0 起,为了防止有人通过编写脚本来从用传统外部机制认证的页面上获取密码,当外部认证对特定页面有效,并且 安全模式 被开启时,PHP_AUTH 变量将不会被设置,但无论如何, REMOTE_USER 可以被用来辨认外部认证的用户,因此可以用 $_SERVER['REMOTE_USER'] 变量.

配置说明:PHP 用是否有 AuthType 指令来判断外部认证机制是否有效。

注意,这仍然不能防止有人通过未认证的 URL 来从同一服务器上认证的 URL 上偷取密码.

Netscape Navigator 和 Internet Explorer 浏览器都会在收到 401 的服务端返回信息时清空所有的本地浏览器整个域的 Windows 认证缓存,这能够有效的注销一个用户,并迫使他们重新输入他们的用户名和密码,有些人用这种方法来使登录状态"过期",或者作为"注销"按钮的响应行为.

例子 34-3.强迫重新输入用户名和密码的 HTTP 认证的范例

<?php  
   function authenticate () {  
     header ( 'WWW-Authenticate: Basic realm="Test Authentication System"' ); 
     header ( 'HTTP/1.0 401 Unauthorized' );  
    echo "You must enter a valid login ID and password to access this resourcen" ;  
    exit;  
  } 
  if (!isset( $_SERVER [ 'PHP_AUTH_USER' ]) ||  
      ( $_POST [ 'SeenBefore' ] == 1 && $_POST [ 'OldAuth' ] == $_SERVER [ 'PHP_AUTH_USER' ])) {  
    authenticate ();  
  }  
  else {  
   echo "<p>Welcome: { $_SERVER [ 'PHP_AUTH_USER' ]} <br />" ;  
   echo "Old: { $_REQUEST [ 'OldAuth' ]} " ;  
   echo "<form action=' { $_SERVER [ 'PHP_SELF' ]} ' METHOD='post'> n " ;  
   echo "<input type='hidden' name='SeenBefore' value='1' />n" ;  
   echo "<input type='hidden' name='OldAuth' value=' { $_SERVER [ 'PHP_AUTH_USER' ]} ' /> n " ;  
   echo "<input type='submit' value='Re Authenticate' />n" ;  
   echo "</form></p>n" ;  
}

该行为对于 HTTP 的 Basic 认证标准来说并不是必须的,因此不能依靠这种方法,对 Lynx 浏览器的测试表明 Lynx 在收到 401 的服务端返回信息时不会清空认证文件,因此只要对认证文件的检查要求没有变化,只要用户点击"后退"按钮,再点击"前进"按钮,其原有资源仍然能够被访问,不过,用户可以通过按"_"键来清空他们的认证信息.

齐博B2B电子商务系统
齐博B2B电子商务系统

齐博B2B系统是一款基于PHP程序和Mysql数据库为基础的开源B2B行业门户电子商务网站建站系统, 系统代码完整、开源,功能全面,架构优秀,提供良好的用户体验、及管理平台,是目前搭建B2B行业门户网站最好的程序之一。齐博B2B具有的功能特点包括:通行证整合功能通过通行证的整合,可以与流行的PHPWIND论坛或Discuz论坛以及Ucenter中心等进行通讯,从而为用户提供更多的交流场所,增加网站

下载

在下例中,我们是使用$PHP_AUTH_USER和$PHP_AUTH_PW这两个变量来验证进入者是否合法并允许进入。在本例中被允许登录的用户名称和密码对分别为tnc和nature:

<?php 
if(!isset($PHP_AUTH_USER))  
{  
Header("WWW-Authenticate: Basic realm="My Realm"");  
Header("HTTP/1.0 401 Unauthorized");  
echo "Text to send if user hits Cancel buttonn";  
exit;  
}  
else  
{  
if ( !($PHP_AUTH_USER=="tnc" && $PHP_AUTH_PW=="nature") )  
{  
// 如果是错误的用户名称/密码对,强制再验证  
Header("WWW-Authenticate: Basic realm="My Realm"");  
Header("HTTP/1.0 401 Unauthorized");  
echo "ERROR : $PHP_AUTH_USER/$PHP_AUTH_PW is invalid.";  
exit;  
}  
else  
{  
echo "Welcome tnc!";  
}

 

事实上再实际引用中不大可能如上面使用代码段明显的用户名称/密码对,而是利用数据库或者加密的密码文件存取它们.

6.3 根据指定的验证信息核实用户身份

首先,我们可以使用以下代码确定用户是否已经输入了用户名和密码,并显示出用户输入的信息.

<?php  
if (!isset($PHP_AUTH_USER)) {  
header('WWW-Authenticate: Basic realm="My Private Stuff"');  
header('HTTP/1.0 401 Unauthorized');  
echo 'Authorization Required.';  
exit;  
}  
else {  
echo "<P>You have entered this username: $PHP_AUTH_USER<br>  
You have entered this password: $PHP_AUTH_PW<br>  
The authorization type is: $PHP_AUTH_TYPE</p>";  
}

说明:

isset()函数用于确定某个变量是否已被赋值,根据变量值是否存在,返回true或false.

header()函数用于发送特定的HTTP标头,注意,使用header()函数时,一定要在任何产生实际输出的HTML或PHP代码前面调用该函数.

虽然上述代码相当简单,没有根据任何实际值对用户输入的用户名和密码进行有效验证,但是至少我们了解了如何使用PHP在客户端产生输入对话框.

下面,我们就来了解一下如何根据指定的验证信息核实用户身份,代码如下:

<?php  
if (!isset($PHP_AUTH_USER)) {  
header('WWW-Authenticate: Basic realm="My Private Stuff"');  
header('HTTP/1.0 401 Unauthorized');  
echo 'Authorization Required.';  
exit;  
}  
else if (isset($PHP_AUTH_USER)) {  
if (($PHP_AUTH_USER != "admin") || ($PHP_AUTH_PW != "123")) {  
header('WWW-Authenticate: Basic realm="My Private Stuff"');  
header('HTTP/1.0 401 Unauthorized');  
echo 'Authorization Required.';  
exit;  
} else {  
echo "<P>You're authorized!</p>";  
}  
}

在这里,我们首先检查用户是否已经输入了用户名称和密码,如果没有则弹出相应对话框要求用户输入身份信息,随后,我们通过判断用户输入的信息是否符合admin/123这一指定用户帐号来授予用户访问权限或提示用户再次输入正确的信息,这种方法适用于所有用户都使用同一登录帐号的网站.

6.4 另一种简易的密码验证 

如果你是在windows98下面编写和运行着你的PHP脚本,或者是你在Linux下面按默认设置,将PHP安装成一个CGI程序的话,你将无法使用上面的PHP程序来实现验证功能,为此,无边给大家提供了另外一种简易的密码验证的方法,虽然实用性不大,但是拿来学习还是挺好的.

<?php 
if($_POST[Submit]=="提交"){  //如果用户提交了数据,则执行操作 
$password=$_POST[password];    //获取用户输入的数据,并保存在变量 password 中 
$cpassword=$_POST[cpassword];   //获取用户输入的确认数据,保存在变量 $cpassord 中 
if(emptyempty($password) || emptyempty($cpassword)) 
{ 
    die("密码不可空!"); 
} 
elseif ( ((strlen($password) < 5) || (strlen($password) > 15))) 
{ 
    die("密码长度在5和15之间"); 
} 
   //--- 值比较 
elseif ( !(strlen($password) == strlen($cpassword)) ) 
{ 
    die("两次输入密码不匹配! "); 
} 
elseif( !($password === $cpassword)) //值和数据类型比较 
{ 
   die("两次密码不匹配! "); 
} 
else  //循环输出密码,因为是密码所以输出*号  
{ 
    for ($i=0;$i<strlen($password);$i++) 
    { 
        echo "*"; 
    } 
} 
} 
?>
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=gb2312"> 
<title>表单验证-密码字段验证</title> 
</head> 
<body> 
<form name="form1" method="post" action="<?=$_SERVER['PHP_SELF'] "> 
请输入密码:<input type="text" name="password"><br> 
确认密码:<input type="password" name="cpassword"><br> 
<input type="submit" name="Submit" value="提交"> 
</form> 
</body> 
</html>


教程链接:

随意转载~但请保留教程地址★

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

463

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

135

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

64

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

20

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

26

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

29

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

14

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

524

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

53

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号