如何实现只让一个IP投一次票

前两天做了一个投票系统,初始计划只让一个IP投一次票,考虑广大用户使用的是局域网,就临时修改了,说说原先的做法。
首先,保证一个IP会想到采用数据库记录IP,然后保存当前时间戳,每次点击判断该ip是否已存在,不存在则记录时间及IP、对投票加1,存在则取出对应ip的时间戳,判断它+86400(一天秒数)与当前时间比较,如果已过一天,则对投票加1.
这么做肯定能阻止恶意刷票,但是即使不考虑广大用户使用的同一个IP局域网,对数据库的频繁查询,也是个问题,于是,又在前一级处理,加了COOKIE,对当前已投票的用户,设置24小时过期cookie,然后当用户点击,先检测cookie,没有则继续操作,有,则直接返回 24小时不能重复投票,终止后面操作,靠cookie还是能阻止大部分用户的。起码降低了对数据库的压力。当然要是有人恶意清除cookie或禁用。也能接着从数据库查询,也就有了两级保证。
可是,每次点击,也要重复向服务器请求。去过滤cookie。为了进一步减小恶意操作带来的压力,于是增加了js处理。对Js设置标志位。由于采用的是AJAX交互,当状态返回成功时将标志位置1,或者按钮点击后对其置1(后者可能会有纰漏),然后每次点击后对该标志位进行判断,如果为1则直接输出‘24小时不能重复投票’,跳过去向服务器传送数据。同时也能快速的响应用户的重复点击。这样就三层保证了。
当然刷新页面也可让js失去作用,清除cookie能让服务器端失去cookie验证,唯一留下的是数据库验证,不过对局域网用户来说是个不好的事情。
这个呢,也是本人近两天做的,临时想法,或许还有其他的如设置session等等。考虑不周,欢迎拍砖。

One thought on “如何实现只让一个IP投一次票”

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>