网上调查是快速收集信息的有效方法,但是目前部分网站的网上调查存在一个不足之处,即任何用户根据自己的爱好可以连续反复投票。因为所有的调查结果都是为决策作参考,不管对一个单位还是一个部门,决策失误都会带来意想不到的损失,所以防止重复投票具有重要意义。本文所给出的基于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的同名变量的值。为了解决这个问题,下面给出方法二。
