2011年7月19日 星期二

網路投票活動防灌票的幾種參考作法

資料來源:http://www.sudu.cn/info/html/edu/20080325/275171.html

網上調查是快速收集信息的有效方法,但是目前部分網站的網上調查存在一個不足之處,即任何用戶根據自己的愛好可以連續反覆投票。因為所有的調查結果都是為 決策作參考,不管對一個單位還是一個部門,決策失誤都會帶來意想不到的損失,所以防止重複投票具有重要意義。本文所給出的基於 ASP(Active Server Page)的幾種方法在一定程度上可以防止連續反覆投票。

ASP對象
在ASP中 有5個對象:Request、Response、Session、 Application、Server。下面只針對本文能用到的對象屬性進行說明,其 他方面的屬性請參考相關資料。本文提供的方法的原理是:設置一個邏輯變量IsVoted,在投票之前驗證IsVoted 的值,只有值為False時,才 能投票,否則就認為已投過票。
Application對象是處理某一特定ASP應用中所有用戶共享信息的對象,也就是說 Application對象是所有聯網機器上所有網頁所共享的對象。由 Application對象所定義和設置的變量,所有用戶的所有網頁均可訪問。利 用Application對象可以定義變量以及改變變量的值,其語法格式如下: Application(「變量名」)=表達式。在.asp 文件中可通 過Application(「變量名」)加以引用。Application把變量的值保存在Web Server 端。

Session 對象用於單個用戶管理信息,Session變量只在頁面間調用(即在一個Session內)。Session變量是私有的,一個Session中某個變量 值的改變不影響另一個Session中同名變量的值。Session對象也把變量值保存在服務器端,但是各個Session保存的位置不同。因為 Session是私有的,所以有多少個Session對象就存在多少個IsVoted變量,這些變量之間沒有關係。

Cookies 對象是不能單獨存在的,它依附於Request和 Response對象,在使用時必須在Cookies前加上Request或Response。同 Application和Session 一樣,Cookies也能保存變量的值,但是Cookies只在瀏覽器客戶端保存變量的值。用 Cookies 所定義的變量有一個屬性:可以設置Cookies變量的使用期限,而且一旦設置了使用期限, Cookies變量可以被從同一台機器上登 錄的所有用戶所共享,我們可以利用Cookies的這個屬性設置間隔一定時間才能再次投票。

Server對象主要完成一些需要WWW服務器處理的工作,本文中我們主要利用Request.ServerVariables讀取Server的環境變量中客戶端的IP地址,並根據IP地址來設定相隔多長時間同一IP地址才能再次投票。

Global.asa 文件完成共享變量和文件的定義及初始化任務。Global.asa文件必須位於ASP應用的根目錄下,一個ASP應用只能有一個Global.asa文 件。Global.asa中含有Application_OnStart、Application_OnEnd、 Session_OnStart、 Session_OnEnd四個事件,我們在Application_OnStart、 Session_OnStart事件中定義 Application變量和Session變量以及進行初始化,這樣在以後的網頁中就可以讀取這些變 量。 ASP在下列情況下讀取Global.asa內容:

1.在Web Server啟動之後,第一次請求調用ASP應用中的任何.asp文件時;

2.不在Session狀態的用戶請求調用ASP應用的.asp文件。

方法一:利用Session對象
在 Global.asa的Session_OnStart事件中設置邏輯變量 IsVoted,初始值為FALSE(表示還沒有投票),投票之後在.asp 程序中把IsVoted的值改為TRUE(表示已投過票)。每次投票之前都要判斷IsVoted的值。如果IsVoted的值為TRUE,就不能再投票; 如果值為FALSE,則可以投票。
因為Session對象的使用必須與瀏覽器的Cookies功能相配合,所以在判斷IsVoted值之前, 必須先判斷瀏覽器的Cookies功能是否打開。如處於關閉狀態,則此種方法失效,所以在這種情況下必須給出提示信息並用Response.End命令中 斷.asp程序的執行,防止連續反覆投票。其流程如圖1:

其中判斷Cookies是否打開的函數比較複雜,現給出函數實現代碼(VBScript)。

< %
Function IsCookiesOpen()
Dim ClientIP, URL, QueryString, IsNew

Application.Lock
If Session(「SessionID")=Session.SessionID Then
IsCookiesOpen = True
ClearApp
Exit Function
End If

IsNew = False
If Session(「SessionID") = Empty Then
CurrentIP =Request.ServerVariables
(「REMOTE_ADDR")
If CurrentIP <> Application(「IP") Then
ClearApp
IsNew = True
End If
End If
If Not IsNew And Application(「Visit") >= 1 Then
IsCookiesOpen = False
ClearApp
Exit Function
End If
Application(「Visit") = Application(「Visit") + 1
Application(「IP") =Request.ServerVariables
(「REMOTE_ADDR")
Session(「SessionID") = Session.SessionID

URL =「_page_=」&Request.ServerVariables
(「PATH_INFO")
QueryString=Request.ServerVariables
(「QUERY_STRING")
If Len(QueryString) > 0 Then URL = URL & 「&" & QueryString
If Not Response.IsClientConnected Then ClearApp
End Function

Sub ClearApp()
Application(「Visit") = 0
Application(「IP") = 「"
End Sub
% >

在.asp文件中直接用IsCookiesOpen()函數來判定 Cookies是否打開。

此種方法的漏洞:如果再打開一個新瀏覽器窗口,會發現在新打開的瀏覽器窗口中仍然可以投票。這是因為Session是私有的,一個Session中變量的改變並不影響另一個Session的同名變量的值。為瞭解決這個問題,下面給出方法二。
方法二:利用Cookies對象
因 為Cookies對象把變量的值保存在瀏覽器客戶端,所以可以根據Cookies保存的IsVoted的值來判斷用戶是否投過票。Cookies變量和 Session變量一樣是私有的,但是如果我們定義了Cookies變量的生存期限,則Cookies變量是公有的,凡是從同一台機器上登錄的用戶在規定 的時間期限沒有達到時,都無法投票,這在一定程度上也能防止反覆投票。實現程序流程如圖2:

根據實際情況合理地設置Cookies變量的生存期限的長短,例如設定為10分鐘,這樣一台機器即使連續投票最多一天也只能投144張票。

此種方法的漏洞:在Windows Arrayx環境下,只要把 WindowsCookies目錄下所有*.txt文件刪除,又可重複投票。為了再進一步防止反覆投票,下面給出方法三。

方法三:驗證IP地址與登錄時間
此 方法首先利用 Request.ServerVariables(REMOTE_ADDR)取得用戶的IP地址。在Web Server端建立一個標準的 MDB類型的數據庫,此數據庫有一個表,該表只有兩個字段:IP地址和登錄時間。之所以設置登錄時間這個字段,是考慮到撥號上網用戶可能共用同一個IP地 址,如果一個IP 地址只能投一次票,那麼顯然不合理。同時,我們還採用方法二同樣的思想,必須每隔一個設定的時間段,同一個IP地址才能再次投票。所以 這種方法比方法一、方法二在防止反覆投票方面要嚴格得多。其實現的程序流程如圖3:

方法四:小範圍調查
這種方法只適用於小範圍調查,思想與方法三相 同,只是把方法三中的 IP地址換成可以唯一代表用戶的字段,如學生證號、工作證號等。這時建立的MDB數據庫只包括兩個字段:證件號碼與 IsVoted(其中IsVoted是邏輯型字段, TRUE表示已投過票,FALSE表示還未投票,在建庫時所有記錄的IsVoted的值都設 為 FALSE)。在投票之前,要求先輸入正確的證件號碼,然後再判斷IsVoted的值。實現這種方法的程序流程如圖4:

從方法一到方法四,安全性越來越高,防止重複連續投票功能越來越強,但是各種方法都有各自的侷限性。在應用中,用戶應 根據實際情況選擇合適的方法。如果小範圍投票,方法四無疑是最好的;如果在Internet上投票,方法三是最好的。另外一點必須提及的是:雖然 Application有保存變量的功能,但是我們沒有用到。因為 Application變量是一個全局性變量,如果用Application把 IsVoted設為TRUE,則任何用戶都無法投票;如果用Application把IsVoted設為FALSE,則任何用戶都可以投票,就沒有任何防 範功能了.

沒有留言: