|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
要想从事软件开发工作,那么,还有很多的知识要学习,其实,不管是以后想去从事哪个工作,都需要自己去利用空闲的时间去不断的学习新的知识,不断的充实自己。apache|论证 在专业的 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;
}
}
?>
模仿的不光是模仿,模仿的同时在加改进,就成了自己的作品了。 |
|