使用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預存程序,如果加入新記錄成功,就返回使用者名稱,如果使用者名稱已經存在,就返回Null 字元串:
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
% 〉