防止网上重复投票的技巧
网上调查是快速收集信息的有效方法,但是目前部分网站的网上调查存在一个不足之处,即任何用户根据自己的爱好可以连续反复投票。因为所有的调查结果都是为决策作参考,不管对一个单位还是一个部门,决策失误都会带来意想不到的损失,所以防止重复投票具有重要意义。本文所给出的基于ASP(ActiveServerPage)的几种方法在一定程度上可以防止连续反复投票。
ASP对象
在ASP中有5个对象:Request、Response、Session、Application、Server。下面只针对本文能用到的对象属性进行说明,其他方面的属性请参考相关资料。本文提供的方法的原理是:设置一个逻辑变量IsVoted,在投票之前验证IsVoted的值,只有值为False时,才能投票,否则就认为已投过票。
Application对象是处理某一特定ASP应用中所有用户共享信息的对象,也就是说Application对象是所有联网机器上所有网页所共享的对象。由Application对象所定义和设置的变量,所有用户的所有网页均可访问。利用Application对象可以定义变量以及改变变量的值,其语法格式如下:Application(“变量名”)=表达式。在.asp文件中可通过Application(“变量名”)加以引用。Application把变量的值保存在WebServer端。
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.在WebServer启动之后,第一次请求调用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)。
<%
FunctionIsCookiesOpen()
DimClientIP,URL,QueryString,IsNew
Application.Lock
IfSession(“SessionID")=Session.SessionIDThen
IsCookiesOpen=True
ClearApp
ExitFunction
EndIf
IsNew=False
IfSession(“SessionID")=EmptyThen
CurrentIP=Request.ServerVariables
(“REMOTE_ADDR")
IfCurrentIP<>Application(“IP")Then
ClearApp
IsNew=True
EndIf
EndIf
IfNotIsNewAndApplication(“Visit")>=1Then
IsCookiesOpen=False
ClearApp
ExitFunction
EndIf
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")
IfLen(QueryString)>0ThenURL=URL&“&"&QueryString
IfNotResponse.IsClientConnectedThenClearApp
EndFunction
SubClearApp()
Application(“Visit")=0
Application(“IP")=“"
EndSub
%>
在.asp文件中直接用IsCookiesOpen()函数来判定Cookies是否打开。
此种方法的漏洞:如果再打开一个新浏览器窗口,会发现在新打开的浏览器窗口中仍然可以投票。这是因为Session是私有的,一个Session中变量的改变并不影响另一个Session的同名变量的值。为了解决这个问题,下面给出方法二。
方法二:利用Cookies对象
因为Cookies对象把变量的值保存在浏览器客户端,所以可以根据Cookies保存的IsVoted的值来判断用户是否投过票。Cookies变量和Session变量一样是私有的,但是如果我们定义了Cookies变量的生存期限,则Cookies变量是公有的,凡是从同一台机器上登录的用户在规定的时间期限没有达到时,都无法投票,这在一定程度上也能防止反复投票。实现程序流程如图2:
根据实际情况合理地设置Cookies变量的生存期限的长短,例如设定为10分钟,这样一台机器即使连续投票最多一天也只能投144张票。
此种方法的漏洞:在Windows9x环境下,只要把Windows/Cookies目录下所有*.txt文件删除,又可重复投票。为了再进一步防止反复投票,下面给出方法三。
方法三:验证IP地址与登录时间
此方法首先利用Request.ServerVariables(REMOTE_ADDR)取得用户的IP地址。在WebServer端建立一个标准的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,则任何用户都可以投票,就没有任何防范功能了.
ASP对象
在ASP中有5个对象:Request、Response、Session、Application、Server。下面只针对本文能用到的对象属性进行说明,其他方面的属性请参考相关资料。本文提供的方法的原理是:设置一个逻辑变量IsVoted,在投票之前验证IsVoted的值,只有值为False时,才能投票,否则就认为已投过票。
Application对象是处理某一特定ASP应用中所有用户共享信息的对象,也就是说Application对象是所有联网机器上所有网页所共享的对象。由Application对象所定义和设置的变量,所有用户的所有网页均可访问。利用Application对象可以定义变量以及改变变量的值,其语法格式如下:Application(“变量名”)=表达式。在.asp文件中可通过Application(“变量名”)加以引用。Application把变量的值保存在WebServer端。
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.在WebServer启动之后,第一次请求调用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)。
<%
FunctionIsCookiesOpen()
DimClientIP,URL,QueryString,IsNew
Application.Lock
IfSession(“SessionID")=Session.SessionIDThen
IsCookiesOpen=True
ClearApp
ExitFunction
EndIf
IsNew=False
IfSession(“SessionID")=EmptyThen
CurrentIP=Request.ServerVariables
(“REMOTE_ADDR")
IfCurrentIP<>Application(“IP")Then
ClearApp
IsNew=True
EndIf
EndIf
IfNotIsNewAndApplication(“Visit")>=1Then
IsCookiesOpen=False
ClearApp
ExitFunction
EndIf
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")
IfLen(QueryString)>0ThenURL=URL&“&"&QueryString
IfNotResponse.IsClientConnectedThenClearApp
EndFunction
SubClearApp()
Application(“Visit")=0
Application(“IP")=“"
EndSub
%>
在.asp文件中直接用IsCookiesOpen()函数来判定Cookies是否打开。
此种方法的漏洞:如果再打开一个新浏览器窗口,会发现在新打开的浏览器窗口中仍然可以投票。这是因为Session是私有的,一个Session中变量的改变并不影响另一个Session的同名变量的值。为了解决这个问题,下面给出方法二。
方法二:利用Cookies对象
因为Cookies对象把变量的值保存在浏览器客户端,所以可以根据Cookies保存的IsVoted的值来判断用户是否投过票。Cookies变量和Session变量一样是私有的,但是如果我们定义了Cookies变量的生存期限,则Cookies变量是公有的,凡是从同一台机器上登录的用户在规定的时间期限没有达到时,都无法投票,这在一定程度上也能防止反复投票。实现程序流程如图2:
根据实际情况合理地设置Cookies变量的生存期限的长短,例如设定为10分钟,这样一台机器即使连续投票最多一天也只能投144张票。
此种方法的漏洞:在Windows9x环境下,只要把Windows/Cookies目录下所有*.txt文件删除,又可重复投票。为了再进一步防止反复投票,下面给出方法三。
方法三:验证IP地址与登录时间
此方法首先利用Request.ServerVariables(REMOTE_ADDR)取得用户的IP地址。在WebServer端建立一个标准的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,则任何用户都可以投票,就没有任何防范功能了.
本文地址:http://www.45fan.com/dnjc/70204.html