一、问题提出背景
在建立网站的过程中,有些网页只允许好友或会员可以浏览,我们称这种网页为加密网页。加密网页的方法很多,如:直接用客户端Script程序而不用数据库进行的加密、用CGI程序进行的加密等,前者由于在客户端执行而使加密的网页很脆弱,后者编程复杂需要有丰富的编程经验,使得这两种方法对于一般的网页设计者来说都不是最佳的选择。本文的密码验证程序是基于Windows NT 4.0(IIS 4.0)环境下的ASP程序,用加密的mdb数据库来存放“用户名称/密码”,利用ASP自带的内部对象对数据库对数据库进行操作,来验证密码和用户名的正确与否,从而打到网页加密的目的。由于使用加密的数据库,即使数据库被其他上网者下载也无法看到“用户该程名称/密码”,所以保密性好,而且利用ASP自带的6大对象,使得数据库访问非常方便,编程异常简单。
二、ASP简介
Active Server Page 是Microsoft提出的一种服务器端的命令执行环境。随着Windows NT(Windows 2000)的普及,其上所带的Web Server(IIS2.0/3.0/4.0)也被越来越多的应用于公司、企业内部intranet或连外的internet的Web服务器,所以ASP(Active Server Page,服务器端的动态网页)理所当然的成为广泛应用的Web程序开发工具。
Active Server Page的出现使Web页面更加多彩多姿;利用Microsoft 的Active Server Page技术,将Script程序代码嵌入HTML文件,创造出动态变化的Web页面。在过去,使用Javascritpt或VBScript开发的Web页面,必须由客户端支持这两种语言的浏览器执行出程序代码的结果,而Active Server Page使我们方便的利用所熟悉的Javascript或VBScripts甚至PERL来开发Web服务器端动态HTML文件;所以,不管任何是否支持JavaScript或VBScript的浏览器,通过Active Server Page技术产生出来的Web页面,将可以摆脱不兼容的问题。
一般,ASP Web页面可以同时包含下面四个部分:
1、 普通HTML文件:普通Web页面的编程。
2、 客户端Script程序代码:<SCRIPT>与</SCRIPT>间的程序代码。
3、 服务器端ASP Script程序代码:位于<%……….%>间的程序代码。
4、 Server—Side Include语句:使用#INCLUDE的语句在Web页面中嵌入其他Web页面。
三、网页加密
网页加密功能的实现由三个文件组成:users.mdb、password.asp、Pwdpage.asp。users.mdb是存放“用户名称/密码”的ACCESS数据库;password.asp是加密网页的精髓,该程序实现“用户名称/密码”输入表单的制作、数据库读取及密码验证等功能;Pwdpage.asp是需要加密的网页。下面对这三个文件分别介绍。
1、 加密的users.mdb数据库
users.mdb是使用Access加密的数据库,建立步骤如下:
(1)启动Access“文件->新建”选择合适目录输入文件名为users.mdb,然后按“确定”键建立数据库“users.mdb”。如图1:
图1建立users.mdb数据库
(2)建立表users:使用表设计器创建表,该表只包含两个字段,如下所示:
字段名称 |
数据类型 |
数据长度 |
字段说明 |
ID |
文本 |
20 |
用户名称 |
Pwd |
文本 |
20 |
密码 |
(3)接着选菜单“工具->安全->设置数据库密码“,如图2:
图2设置数据库密码
在ASP程序中如何启动含有密码的数据库呢?其实很简单,只要在Connection对象的Open方法中增加Pwd的参数即可,例如:
SQLstr=”driver:{Microsoft Access Driver (*.mdb)};Pwd=ding”
SQLstr=SQLstr&”;dbq=”&server.MapPath(“users.mdb”)
Conn.open SQLstr
2、网页加密的核心:password.asp
password.asp文件又可分为三个子程序段:
(1)“用户名称/密码”的输入表单,程序片断如下:
<HTML>
<BODY BGCOLOR="#FFFFFF">
<H2 ALIGN=CENTER><%=Head%><HR WIDTH="100%"></H2>
<CENTER>
<FORM Action=<%=Request.ServerVariables("PATH_INFO")%> Method=POST>
<TABLE BORDER=1 CELLSPACING=0 >
<TR>
<TD ALIGN=RIGHT>用户名称:</TD>
<TD><Input Type=Text Name=ID Size=12 Value=<%=ID%>></TD>
</TR>
<TR><TD ALIGN=RIGHT>密码: </TD>
<TD><Input Type=Password Name=Pwd Size=12 Value=<%=Pwd%>></TD>
</TR>
</TABLE><P>
<Input Type=Submit Value=" 确定 ">
</FORM>
<HR WIDTH="100%">
</CENTER>
</BODY>
</HTML>
重点是<FORM>标记的Action参数,一般来说,我们会指定给它某一个.asp文件名称,例如:Password.asp,在此则指定成:Request.Server variables(“PATH_INFO”);如果password.asp被含入Pwdpage1.asp,则这个参数得到Pwdpage1.asp,如果password.asp被含入Pwdpage2.asp,则这个参数得到Pwdpage2.asp,所以无论Password.asp文件被包含进哪一个网页,以上语句都能得到正确的.asp文件名称。
(2)密码验证函数:
接下来是实现密码验证的函数,这个函数传人ID(用户名称)及Pwd(密码),若验证通过返回TRUE,否则返回FALSE,内容如下:
<%
Function checkpassword( ID, Pwd )
Dim conn, SQLstr, rs
Set conn = Server.CreateObject("ADODB.Connection")
SQLstr = "driver={Microsoft Access Driver (*.mdb)};Pwd=ding"
conn.Open SQLstr & ";dbq=" & Server.MapPath("users.mdb")
sql = "Select * From users Where ID='" & ID & "' And Pwd = '" & Pwd & "'"
Set rs = conn.Execute( sql )
If rs.EOF Then
checkpassword = False
Else
checkpassword = True
End If
End Function
%>
这段程序的关键点是:users.mdb是一个加密的数据库,所以启动时必须有“Pwd=ding”参数;用Select选取符合条件的数据记录,若为0则表示ID/Pwd是错误的,返回False,否则表示ID/Pwd是正确的,返回True。
(3)密码验证与输入表单的结合
下面的这段服务器端执行的程序实现密码验证与输入表单的结合:
<%
If IsEmpty(Session("Passed")) Then Session("Passed") = False
Head = "请输入您的认证资料"
ID = Request("ID")
Pwd = Request("Pwd")
If ID = "" Or Pwd = "" Then
Head = "请输入您的认证资料"
ElseIf Not checkpassword( ID, Pwd ) Then
Head = "用户名称或密码错误"
Else
Session("Passed") = True
End If
If Not Session("Passed") Then
%>
<HTML>
…输入表单程序部分
</HTML>
<%
Response.End
End If
%>
Session(“Passed”)的功能是记录连接者是否已经通过密码验证,如果已通过验证,则下次浏览该网页时就不用再输入用户名称及密码了。
3、需要加密的网页:Pwdpage.asp
实际上,Pwdpage.asp可以是任何已制作好的.asp网页,如想对该网页加密,只需把users.mdb和Password.asp复制到Pwdpage.asp所在的目录下,并在文件头加入下列语句:
<!--#include file=”password.asp”à即可实现对网页的加密。
四、程序清单
1、 Password.asp:
<%
Function checkpassword( ID, Pwd )
Dim conn, SQLstr, rs
Set conn = Server.CreateObject("ADODB.Connection")
SQLstr = "driver={Microsoft Access Driver (*.mdb)};Pwd=ding"
conn.Open SQLstr & ";dbq=" & Server.MapPath("users.mdb")
sql = "Select * From users Where ID='" & ID & "' And Pwd = '" & Pwd & "'"
Set rs = conn.Execute( sql )//以上为执行数据库打开、比较的部分。
If rs.EOF Then
checkpassword = False
Else
checkpassword = True
End If
End Function
%>
<%
If IsEmpty(Session("Passed")) Then Session("Passed") = False
//当上网者已经输入密码时Session(“Passed”)不为空,则不在执行Password.asp页。
Head = "请输入您的认证资料"
ID = Request("ID")
Pwd = Request("Pwd")
If ID = "" Or Pwd = "" Then
Head = "请输入您的认证资料"
ElseIf Not checkpassword( ID, Pwd ) Then
Head = "用户名称或密码错误"
Else
Session("Passed") = True
End If
If Not Session("Passed") Then
%>
<HTML>
<BODY BGCOLOR="#FFFddd">
<H2 ALIGN=CENTER><%=Head%><HR WIDTH="100%"></H2>
<CENTER>
<FORM Action=<%=Request.ServerVariables("PATH_INFO")%> Method=POST>
//Action参数是关键
<TABLE BORDER=1 CELLSPACING=0 >
<TR>
<TD ALIGN=RIGHT>用户名称:</TD>
<TD><Input Type=Text Name=ID Size=12 Value=<%=ID%>></TD>
//ID从checkpassword函数中获得
</TR>
<TR><TD ALIGN=RIGHT>密码: </TD>
<TD><Input Type=Password Name=Pwd Size=12 Value=<%=Pwd%>></TD>
//Pwd从checkpassword函数中获得
</TR>
</TABLE><P>
<Input Type=Submit Value=" 确定 ">
</FORM>
<HR WIDTH="100%">
</CENTER>
</BODY>
</HTML>
<%
Response.End
End If
%>
2、 Pwdpage.asp:
<!--#include file="password.asp" -->
//把此语句加入需要加密网页的最前面
<HTML>
<BODY BGCOLOR="#FFFFdd">
<H2>加密的网页 <HR></H2>
<P>这个网页十分简单,只要在原始码的最前面加上以下标识:</P>
<UL>
<P><FONT COLOR="#FF0000"><!--#include file="
<B>password.asp</B>"--></FONT></P>
</UL>
<P>就已经具备加密的功能。快快试试吧!
<HR WIDTH="100%"></P>
</BODY>
</HTML>
五、总结
本文网页加密的关键是Password.asp程序,要做到正常运行,必须使得users.mdb数据库中的表users的字段名称与Password.asp引用的字段名称相一致。一旦users.mdb与Password.asp两个文件正确建立后,就可以一劳永逸,对任何.asp文件都可以轻松加密。总之,利用微软的Active Server Page技术开发的程序简单,而且代码重用性高,ASP与ADO的完美结合,使得开发网络数据库程序不在是非常困难的事了。
|