投票防作弊

防止用用重复投票

  在线投票系统中最主要的一个功能就是禁止用户对某一投票的主题进行重复投票,即用户只能对一个主题投票一次,投票后将不能继续投票。实现这一功能通常有两个方法:一种是当用户进行投票时,系统首先获取该用户的IP地址,然后将它与数据库中存在的IP地址比较,如果能检索出相同的IP地址,就给用户弹出错误信息。如果没有则会完成用户投票执行的次数增加的操作,并将该用户的本地IP地址存入数据库中;另一种方法是使用Cookie对象确认用户的行为。

  采用第二种方法。由于系统中存在多个投票主题,为了区别多个Cookie项,可以使用每个主题的ID作为Cookie的值。例如:用户为ID为1的投票主题投票时,则这个用户的

Cookie中会多一个新项("VoteItem","1").如下:

      HttpCookie makecookie= new HttpCookie("Vote" + M_Str_voteID);//制造cookie

      makecookie.Values.Add("VoteItem", readcookie.Values["VoteItem"] + "<" + M_Str_voteID + ">");

  用户投票之前对该用户的Cookie进行判断。首先读出Cookie的值,然后对该值进行判断。如果读出的Cookie的值为null,则表该用户从未使用过该投票系统,那么就对新创建的

Cookie值,并设置过期时间。如果该用户已经使用过该投票系统,就判断该用户是否对该主题投过票,若对该主题投过票,就给出错误提示并不执行投票操作,否则设置Cookie对象的值。如下:      

   //投票防作弊
        HttpCookie makecookie= new HttpCookie("Vote" + M_Str_voteID);//制造cookie
        HttpCookie readcookie = Request.Cookies["Vote"+M_Str_voteID];//读出cookie

        if (readcookie == null)//从未投过票
        {
            makecookie.Values.Add("VoteItem", "<" + M_Str_voteID + ">");//设置其值
            makecookie.Expires = DateTime.MaxValue;//设置过期时间
        }
        else//已经投过票
        {
            string P_Str_AllItem = readcookie.Values["VoteItem"].ToString();//读取已投票的项
            if (P_Str_AllItem.IndexOf("<" + M_Str_voteID + ">") == -1)//未对该主题投过票
            {
                makecookie.Values.Add("VoteItem", readcookie.Values["VoteItem"] + "<" + M_Str_voteID + ">");
            }
            else//已对该主题投过票
            {
                Response.Write("<script language=javascript>alert('该主题你已经成功投过票,不能重新投票!');</script>");
                return;
            }

posted @ 2012-03-13 16:43  舍鱼  阅读(773)  评论(0编辑  收藏  举报