利用IP地址限制单位时间内投票次数

本文探讨了六种防止网络投票中刷票行为的方法,包括使用Session、Cookie、IP地址结合数据库等,并分析了各自的优缺点及适用场景。还提供了一个基于IP地址限制投票频率的具体实现案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   三天来什么事情也没做,全部时间都在研究这个问题,限制对于防止倒票没有什么绝对的好方法,尤其是

用户不需注册的情况下的投票:我们来看看有那些方法来防止倒票:

1.Session  采用Session对象防止重复投票好像还不错,如果您利用单一浏览器进行测试,确实可以证明

Session具有防止重复投票的功能,实际上开启另一个浏览器,Session变了,那么又可以投票了.为什么呢?

因为每一个执行中的浏览器对应一个Session对象,虽然我们可以设置第一个浏览器的Session值,但是第二

个.第三个.....无法设置了..

2.Cookie   一般利用Cookie进行设置,主要是设置Cookie的失效时间,也就是在这段时间内,这台电脑的信

息被Cookie保存,你可以做允许的事情,这样我们可以利用其进行投票,比如说登录的时候将Client的IP地址

赋值给Cookie,Cookies("Value").Expires="12/31/2999";用户登录的时候,我们检查Cookie是否有值,来决

定他是否有权限进行投票.这种方法比Session应该好多了,重启,开启多个浏览器都被Cookie左右,但是致命

的一项是Cookie是可以清除的,这样我们的设置又轻易的被破解了.

3.IP+数据库 这是目前还算有效但是不是绝对有效的方法,下面的示例将记录我做的教师测评的限制IP的源

码.用户登录的时候,取得Client端的IP,并且与系统数据库存储的IP比较(系统存储的数据可以按照时间的

降序排列,这样如果有重复IP,我们只比较最上面的那条就可以了,具体看代码!):

   如果相同的话,再次比较时间,如果两者时间差超过半小时则可以投票,否则警告信息:一台电脑半小时内

只能投票一次;

   如果不相同的话,就是说明这个IP没有投票过,那么可以进行投票,同时更新IP和时间纪录!

   这种方法也有一致命的漏洞---动态IP地址,比如ADSL还有其它的动态变化的IP等等,这样也就失去作用

了(由于我们学校是静态IP,所以我这样做啦,o(∩_∩)o...哈哈).

4.IP+Cookie 这种方法又多了一层保障,但是对于动态IP地址+删除Cookie的组合来说还是可以破解的.

5.Mac 网卡的物理地址在世界唯一,我们可以通过网卡的Mac地址(物理地址)来进行锁定电脑,这方法看起来

不错,但是很多软件都能制造伪Mac地址....

6.就是用户注册ID投票,这样限制一个ID只能投票一次或者单位时间内只能投1次效果是非常好的,但是一个

人也可以注册很多用户ID啊!!

  所以上述6中方法没有一种是100%有效的方法,大家根据自己所需,按照自己的要求选择,所谓防君子,不防

小人嘛o(∩_∩)o...哈哈

  下面是我用IP限制用户投票的源码,数据表有3个字段,auto_num 自动编号 user_IP 用户IP varchar 50, access_time 用户访问时间 varchar 50

//Visual Studio 2005  SQLServer 2005 Express  C# language ;Just For Static IP Address

 protected void Page_Load(object sender, EventArgs e)

    {

        string guestip = Request.ServerVariables["REMOTE_ADDR"];

        TimeSpan dt = new TimeSpan();

        string ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True;User Instance=True"; //数据库链接字符串

        string Sql = " SELECT user_IP,access_time FROM userip Where user_IP= '" + guestip + "'";//在这里被憋了3天

        Sql += " ORDER BY auto_num DESC";

        SqlConnection thisConnection = new SqlConnection(ConnectionString);

        SqlCommand thisCommand = new SqlCommand(Sql, thisConnection);

        thisCommand.CommandType = CommandType.Text;

        thisCommand.Connection.Open();

        SqlDataReader dr = thisCommand.ExecuteReader();

        if (dr.Read()) //阅读器能够读出数据(说明此IP以前投票过)

        {

            //Response.Write(dr["user_IP"]);//查看是否能读出数据表存储的IP

            //Response.Write(dr["access_time"]);//查看是否能读出数据表存储的访问时间

            dt = DateTime.Now - Convert.ToDateTime(dr["access_time"]);

            dr.Close();

            if (dt.TotalMinutes >= 30) {    //===距离上次投票超过30分钟了

                string ss = DateTime.Now.ToString();

                Sql = "INSERT INTO [userip] ([access_time], [user_IP]) VALUES ( '" + ss + " ', '" + guestip + " ')";                  

                thisCommand = new SqlCommand(Sql,thisConnection);

                thisCommand.ExecuteNonQuery();

                Response.Write("投票,并更新IP与投票时间");

                Response.Write("你30分钟内未投票");

            }

       else if(  dt.TotalMinutes < 30)

               {   Response.Write("您30分钟内投票过,请稍后再投!");   }        

        }

        else  //此IP从未投票过情况

        {

            dr.Close();

            Response.Write("没有您搜索的IP,你可以投票,系统将记录你的IP和投票时间");

            string tt = DateTime.Now.ToString();

            Sql = "INSERT INTO [userip] ([access_time], [user_IP]) VALUES ( '" + tt + " ', '" + guestip + " ')"; 

            thisCommand = new SqlCommand(Sql, thisConnection);

            thisCommand.ExecuteNonQuery();

        }

        thisCommand.Connection.Close();

    }

    刚刚学习C# 害苦我了,学习了5天了,在各位优快云达人的帮助下,做出了一个教师测评系统,o(∩_∩)o...哈哈,自己有成果的时候是最开心的时候,刚刚搬来CnBlogs,希望认识大家 我只是个菜鸟!!

转载于:https://www.cnblogs.com/leoburn/archive/2007/10/06/915260.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值