电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> PHP
PHP+APACHE实现用户论证的方法-PHP教程,PHP应用
作者:网友供稿 点击:22
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 
在专业的 web 站台上,常常会需要使用者的帐号及密码,也就是身份确认的动作。早期的 ncsa httpd 伺服器并没有提供这项使用者确认的功能,webmaster 只能用手工打造一个身份确认的 cgi 程式。
自 cern httpd 之后的 web 伺服器大部份都提供了使用者身份确认的功能。仅管每套 web 伺服器的设定都不太相同,但在设定上都大同小异。

以下就是 apache 伺服器上的使用者身份确认的设定。


<directory /home/mymember>
authtype basic
authname mymember
authuserfile /usr/local/mymember.txt
options includes execcgi
<limit get post>
require valid-user
</limit>
</directory>

在这个例子中,当使用者在看 mymember 目录下所有的档案,包括图片档案及其它各式档案时,都需要使用者的帐号密码确认。而使用者的帐号及密码档都存在于/usr/local/mymember.txt 之中。

这个帐号密码档 /usr/local/mymember.txt 的样子可能如下例。其中冒号前的字串是使用者帐号,冒号之后的字串是经过不可还原加密的密码,编码一般都是使用传统的 des 编码,密码的头二个字是类似种子的字元 (salt),本例中都是 3p。每行代表一位使用者。当然 webmaster 要自行控制重覆帐号的情形。比较特殊是在 win32 系统上架 apache 的情形,冒号后的密码不可加密,因为 win32 没有提供这方面的编码
api,因此使用者密码以明码的方式存在。


john1234:3pwudbljmiwro
queenwan:3pfnvlnpn9w0m
noname00:3pesxajx5pk7e
wilson49:3pjowb0enag22
rootboot:3pit0sni6.84e
sun_moon:3pvymmenoc.x.
nobody38:3pbskpkwv94hw

在 apache 1.3.6 版上,可以用 ~apache/bin/htpasswd 来产生单笔的帐号及密码,但对于需要大笔资料的商业站台,可能就需要自行写程式来处理了。unix 上需要呼叫 crypt() 来处理编码。



在一切都设定好了之后,连线时就会在浏览器出现查核密码的视窗,如上图就是seednet 的 myseed 网站的使用者查核机制。在输入了帐号及密码后,浏览器会将它用base64 编码后,传到伺服器端。当然 base64 只是编码不是加密,因此在网路上这种传输的安全性仍然不高,还是有可能被中间的刽客截下,再将 base64 还原,这也是整个使用者认证中最美中不足的地方,或许日后支援摘要认证 (digest) 及使用 md5 编码后,可以解决这种问题。之后每一页仍然需要帐号及密码,只不过浏览器会帮你主动送出,不用再输入帐号密码了。这方面浏览器会保留到被关闭为止,下次重执行浏览器仍需输入第一次。

在使用者数量少时,使用上述的方法轻松又省事。但是在使用者有数万人,甚至数十万人时,会发生整个伺服器的效率都被搜寻帐号密码下拖垮,可能读取一页需要数十秒到数分钟。这种情形再使用伺服器提供的密码查核机制就不太明智了。在netscape enterprise server 上可能就可以使用 nsapi 来开发自己的查核方式,在iis 上也可以用 isapi 过滤器开发。写 c/c++ 程式呼叫 nsapi/isapi 总是很累,在php 上有了另外的选择,这也是本节的主题。


php 的 http 相关函式库提供了 header() 的函式。许多 web 伺服器与客户端的互动,都可以使用这个函式来变戏法。例如在某个 php 页面最开始处,也就是第一行或第二行,加入以下的程式,可以将使用者重导到作者的网页。


<?php
header("location: http://wilson.gs");
exit;
?>


当然,在上述程式之后的 html 文字或者是 php 程式都永远不会出现在使用者端了。

同样的道理,我们就用 header() 来变使用者认证的把戏。可以在 php 的最开头送出字串到使用者端,就会在使用者端出现下图的视窗。


<?php
header("www-authenticate: basic realm="member"");
header("http/1.0 401 unauthorized");
?>

在程式中字串 realm="member" 中的 member 字样出现在图中,当然若使用中文字取代,浏览器端也会出现中文字,如上面的 myseed 图。若 web 站台使用者还有其它语文,如英文或日文,送出中文的 realm 字串似乎就比较不合适。无论如何,这都要视站台的性质及使用者定位而决定。

当然这还是很粗糙,因为除了送出视窗后,就没有下文了,帐号输入正确也好,输入错误也罢,都不会有任何的结果。我们需要再更进阶的程式来处理。


在后端的使用认证上,考虑使用资料库作为储存帐号及密码的后端,在这种架构可以容纳许多的使用者,管它一万个使用者还是十万个使用者。若您的站已有数十万个使用者帐号,那么恭喜您,您的站算是世界级的大站了。mysql 是个不错的选择,许多站台,甚至是商业化的站台都用它来做后端的资料库。当然您要架真正的商业站台,钱不是问题的话,那可以使用口碑最广的 oracle 资料库系列。

要在 php 中使用任何资料库,都要先将资料库的伺服器端及客户端设定好,之后才编译 php 及 apache 系统。

准备好 mysql 及 php 之后,先在 mysql 中加入新的资料库,本例是加入mymember,用别的名字当然也可以。mysql 要加入资料库 (database) 很容易,只要在mysql 存放 database 的地方 mkdir 就可以了。例如在 unix shell 下打

hahaha:/usr/local/mysql/data# mkdir mymember

在建立了资料库之后,尚需要建立资料表格 (table) 方能使用。设定的表格如下,可以将它储在 /tmp/memberauth.sql 中


create table memberauth (
serial mediumint(9) not null auto_increment,
username char(8) not null,
password char(8) not null,
enable char(1) default ’0’ not null,
primary key (serial)
);

档案 memberauth.sql

先看看 memberauth.sql 的这些栏位。serial 是个自动增加的整数栏位,每输入一笔资料,就会自动加一,这当然不能是空的栏位,于是就用 not null 了。第二个栏位是 username,代表使用者的帐号,为了统一以及适应各系统起见,设定成八个字,当然这个栏位也不能是空的。password 是第三个栏位,为使用者的密码。第四个栏位 enable 做为帐号是否有效的旗标,设计上 0 表示无用,1 表可用,日后还可加入其它值做不同的用途。

设计好了资料表之后,就要将资料表加入资料库了。由于常要使用 mysql 资料库,可以到 http://www.phpwizard.net/phpmyadmin 下载 phpmyadmin,使用浏览器操作及管理 mysql,轻松又方便。若使用这套 phpmyadmin 可以在它的使用者介面上输入memberauth.sql 加入 mysql 中。或者也可以在 unix shell 下输入下式,也是有同样的效果。

mysql mymember < /tmp/memberauth.sql

在准备好了之后,就可以输入使用者帐号及密码在 memberauth 资料表中了。当然还是使用 phpmyadmin 方便,用 mysql 程式就要一笔笔的 insert 了。

接着进入了设计函式的阶段了。


<?php
file://---------------------------
// 使用者认证函式 auth.inc
// author: wilson peng
// copyright (c) 1999
file://---------------------------
$error401 = "/home/phpdocs/error/401.php";
if ($php_auth_pw=="") {
header("www-authenticate: basic realm="超金卡会员"");
header("http/1.0 401 unauthorized");
include($error401);
exit;
} else {

$db_id = mysql_pconnect("localhost", "myid", "mypw");
$result = mysql_db_query("mymember","select password, enable
from memberauth where username=’$php_auth_user’");

$row = mysql_fetch_array($result);
$memberpasswd = $row[0];
$memberenable = $row[1];
if ($memberenable==0) {
echo "您的帐号被停用了";
exit;
}

if ($php_auth_pw!=$memberpasswd) {
header("www-authenticate: basic realm="超金卡会员"");
header("http/1.0 401 unauthorized");
include($error401);
exit;
}
}
?>

copyright (c) 1999, wilson peng

要使用这个 auth.inc,要在每个 php 的第一行加入
<? require("auth.inc"); ?> 。
在加入本程式的 php 档案都会检查帐号密码,图片等就不会检查,比起使用 web 伺服器功能的某目录下全都检查,php 显得有弹性多了。

$error401 = "/home/phpdocs/error/401.php";

这行表示在使用者按下取消,或检查失败时,要显示给使用者看的档案。

if ($php_auth_pw=="") {
header("www-authenticate: basic realm="超金卡会员"");
header("http/1.0 401 unauthorized");
include($error401);
exit;
} else


到 else 之前,若没有传入密码,则送出输入密码的视窗。其中的
$php_auth_user、$php_auth_pw 是 php 中特殊的变数,分别代表使用者确认的帐号及密码。上面的程式也是利用这二个变数来处理使用者认证。

$db_id = mysql_pconnect("localhost", "myid", "mypw");
$result = mysql_db_query("mymember","select password, enable from
memberauth where username=’$php_auth_user’");

$row = mysql_fetch_array($result);
$memberpasswd = $row[0];
$memberenable = $row[1];

若使用者有输入帐号及密码,则向资料库查询。同时查核该使用者是否仍可使用。

if ($memberenable==0) {
echo "您的帐号被停用了";
exit;
}

上四行程式为帐号被停用的情形。

if ($php_auth_pw!=$memberpasswd) {
header("www-authenticate: basic realm="超金卡会员"");
header("http/1.0 401 unauthorized");
include($error401);
exit;
}

密码错误则再次向使用者要求输入帐号及密码。

在实际使用时,可以视需要加入的网页再加入 auth.inc 这个档案,就不用连看张图形也要查一次密码,降低伺服器和使用者二端的资源。当然,和 mysql 的连系上,可以使用 mysql_pconnect() 一直和 mysql 伺服器连线。或是使用mysql_connect() 每次重新连线,用这个函式要记得早点使用 mysql_close() 将资料库关闭。下面的程式 auth1.inc 是另一版本的认证程式,就是开启连线后马上关闭,释放资源的例子。


<?php
file://---------------------------
// 使用者认证函式-1 auth1.inc
// author: wilson peng
// copyright (c) 1999
file://---------------------------
$error401 = "/home/phpdocs/error/401.php";
if ($php_auth_pw=="") {
header("www-authenticate: basic realm="超金卡会员"");
header("http/1.0 401 unauthorized");
include($error401);
exit;
} else {

$db_id = mysql_connect("localhost", "myid", "mypw");
$result = mysql_db_query("mymember","select password, enable
from memberauth where username=’$php_auth_user’");

$row = mysql_fetch_array($result);
$memberpasswd = $row[0];
$memberenable = $row[1];
mysql_close($db_id);
if ($memberenable==0) {
echo "您的帐号被停用了";
exit;
}

if ($php_auth_pw!=$memberpasswd) {
header("www-authenticate: basic realm="超金卡会员"");
header("http/1.0 401 unauthorized");
include($error401);
exit;
}
}
?>

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·Windows下的PHP5.0安装配制详解-PHP教程,PHP安装
·PHP在XP下IIS和Apache2服务器上的安装-PHP教程,PHP应用
·最近忙于FTP,好站多多!有好多好东东哦!不敢独享!-PHP教程,PHP基础
·PHP 5.0 Pear安装方法-PHP教程,PHP安装
·PHP开发利器-PRADO 1.6(4)-PHP教程,PHP应用
·Sun Sparc Solaris 2.6 Apache-1.3.12+MySQL-3.23.5+PHP-3.0.15 安装记-PHP教程,PHP应用
·php5学习笔记(转)-PHP教程,PHP应用
·APACHE安装笔记-PHP教程,PHP安装
·PHP.MVC的模板标签系统(四)-PHP教程,PHP应用
·PHP.MVC的模板标签系统(二)-PHP教程,PHP应用

最新文章
·PHP源码-利用 QQWry.Dat 实现 IP 地址高效检索
·Php高手带路--问题汇总解答[2]
·PHPQQ编程(2):取QQ在线状态
·php5手动最简安装方法
·福利彩票幸运号码自动生成器
·PHP开发利器-PRADO 1.6
·在Apache 服务器上启用PHP支持
·Windows2000_pro下安装Apache+PHP4+My
·php文件上传的实现
·PHP开发框架的现状和展望


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号