使用Session变量的问题
虽然Session变量是简单易用的,而且比其他方法要安全,但还是有一些问题。首先,只有访问者的浏览器支持cookie时,Session变量才能正常工作。尽管现在大多数浏览器都支持cookie,但是记住访问者可以拒绝使用它(这依赖于浏览器的安全设置)。
其次,特别在IIS4中,当浏览器请求多个页面时,Session变量可能被半途丢失。通常,遵循下面三个简单原则可以将这个漏洞减少到最小:
○ 只使用一个global.asa文件,放置在站点的根目录下。附带多个global.asa的嵌套应用程序,可能导致session变量使用越界。
○ 确认IUSE帐号或者它所属的组对global.asa文件至少有读的权限,并且IIS拥有Anonymous访问权限。
○ 要确认在所有页面中你都使用同样的字符大小写格式。Netscape(以及其他浏览器)对于/ThisFolder/ThisFile.asp 和 /thisfolder/thisfile.asp 这两个链接是当作在两个不同目录下的两个不同文件看待的。所以当从页面中取回一个cookie时,可能会因为大小写问题发生错误。
在数据库中保存登录信息
如果需要跟踪大量访问者的信息,仅仅使用include文件的方式就会变得很难管理。这时,我们可以使用数据库。利用此技术,同样适用于运行访问者加入或者在线登记的情况,并且将他们加入用户列表。对于这个问题在此不做进一步探讨。
使用数据库处理全部的过程是非常简单的!当用户提供了登录信息后,使用SQL的SELECT命令在数据库中查找输入的用户名,并取回匹配的口令。如果取回的口令与输入的口令一致,就允许他们进入下一步:
strSQL = "SELECT sPassword FROM Users " _ & "WHERE sUsername = " & Request("v1") & ""
加入登录信息的问题
然而,加入新用户是一个小难题。如果发现用户在数据库中不存在,并且决定使用ASP自动加入他们,我们就必须注意了。换言之,当用户填写新的信息时,可能有另外的用户使用同样的用户名在做同样的事情,而且后者动作快,首先在数据库中保存了信息,这样,前者的加入工作就不能完成。
有2个显然的方法可以避免这个现象。一个方法是:自动建立一个带空口令的新记录,用户日后可以修改它:
strSQL = "INSERT INTO Users (sUserName, sPassword) " _ & "VALUES(" & Request("v1") & ", null)"
一个更好的方法是:如果新记录创建成功,就使用一个过程返回一个特殊的数值(比如用户名),或者,如果不成功,返回错误信息。这样,用户就可以选择一个新的用户名。下面的例子是使用SQL Server存储过程,如果加入新记录成功,就返回用户名,如果用户名已经存在,就返回空字符串:
CREATE PROCEDURE AddUser @s_user varchar(12), @s_pword varchar (12) AS
IF EXISTS (SELECT * FROM Users WHERE sUserName = @s_user)
SELECT
ELSE
BEGIN
INSERT INTO Users (sUserName, sPassword)
VALUES(@s_user, @s_pword)
SELECT sUserName FROM Users WHERE sUsername = @s_user
END
这样就可以在ADO中执行这个过程,并检查返回值来确认是否添加成功。如果失败,就通知用户选择一个新用户名。这里有一些代码描述了如何使用上述的存储过程,你可以从本文下载的文件中找到这些代码。
以下是从表单中收集的数据:
strUserName = "NewUser1"
strPassword = "ThePassword"
定义数据库连接:
strConnect = "DRIVER={SQL Server};SERVER= yourserver ; " _
& "DATABASE= yourdatabase;UID= yourusername;PWD= yourpassword ;"
建立并打开数据库连接:
Set oCon = Server.CreateObject("ADODB.Connection")
oCon.Open strConnect
建立command对象,设置属性
Set oCmd = Server.CreateObject("ADODB.Command")
oCmd.ActiveConnection = oCon our open connection
oCmd.CommandType = 4 its a stored procedure
oCmd.CommandText = "AddUser" the procedure name
提供参数执行command对象,得到结果:
Set oRs = oCmd.Execute (lngRecsAffected, Array(strUserName,strPassword))
strResult = Trim(oRs.Fields(0)) ADO may add a space to the result
显示结果,如果错误,显示“user exists warning”:
If strResult = "" Then
Response.Write "User Already Exists"
Else
Response.Write "Added new user: 〈 B 〉" & strResult & "〈 /B 〉"
End If
% 〉