PHP+MySQL,关于防刷票的问题,太敬业了服务器都刷死了

LUIJI 发布于 2013/06/17 15:28
阅读 6K+
收藏 3

我这里有时会办一些评选活动,牵扯到网络投票,不可避免的就会遇到被刷票的问题,本身我做了一些防刷票处理,但效果不理想,而且面对刷票机大量的提交,服务器也会扛不住,所以想咨询一下,到底哪些方式可以较有效防止刷票,尤其是可以减少服务器压力?

------------------------------

下面是我的做法(新手,见笑):

1、先是在前台页面用Ajax提交到后台PHP:

2、后台PHP收到后会判断:提交来源地址,如果不是活动网页则不允许提交;还有同IP提交间隔,每个提交入库后记录IP,然后之后的提交都去匹配此IP最后提交时间,比对间隔,小于规定间隔不允许提交。

页面端的Cookie等等限制,其实也没多大用,意义不大。

一开始我们这边没有限IP,说白了就是给人家来刷,为了人气嘛,后来刷得厉害了,服务器和数据库压力都已经太大了,就开始限制IP:


比如设为60秒,也就是那个$limit_distance=60。限制后,数据库压力减小,因为没有了大量的入库及更新操作,只是不断的需要进行select及比对,但就在那60秒的一瞬间,数据库压力会很大,证明刷票机在疯狂的提交,而就在这60秒一瞬间,我发现数据库里这个IP一下子多了七八条数据,按理说既然是筛选IP,只应该有一条进去啊,为什么一下子进去那么多?会不会和MySQL的锁机制啊什么的有关,我是不太懂啦,因为我的PHP入库代码只是简单的mysql_query之类的提交,没有用事务,mysql的表是MyISAM的,没有多余设置,主键自增,我想知道,在这种简单配置下,会不会因为刷票机的极大密度提交导致IP还没有对比完成就已经提交了新数据入库?


上面可以看出,一分钟的限制实际上是有效果的,但是这个IP在每一分钟的一瞬间可以塞进来好几条,这到底是什么原因造成的?

之前领导说不限制IP,结果一两天被人家刷了五百多万票,数据库都被刷死了。。。现在限制IP,效果好多了,但就是那每一分钟的一瞬间会把MySQL的CPU冲到70-80%,可见那个刷票的太“敬业”了~

而实际上这是两天前的情况,昨天最后一天投票,他们已经开始用不断换IP来刷了,不过可能技术上稍稍麻烦一些,刷的没有太厉害,一整天下来也就刷了几万票吧,不过服务器还是被他们不断的发送请求搞的很卡。

有没有这方面的老手能够分享些经验,怎样能够做好投票?根本杜绝刷票那也不现实,只是能尽量的减少服务器和数据库压力就好。

加载中
0
Tuesday
Tuesday
用cookie, session呀.
0
回去干活
回去干活
IP唯一处理了.
0
十一文
十一文
同一ip 加验证码!
0
十一文
十一文

你数据库 没对ip字段做索引吧〉???


0
LUIJI
LUIJI

验证码的方式我考虑过,但面对刷票机这种请求密度,不断的生成验证码会不会更加加大服务器压力?

0
LUIJI
LUIJI
ip索引确实没有加,具体加什么索引?唯一肯定不行,因为不能限制一个IP不能投第二次,只是要间隔一段时间后再投。加了索引能不能解决我说的一瞬间同一IP提交好多条的情况?另外,cookie和session都是初级的验证,对刷票公司来说太儿科了
Jackin
Jackin
回复 @hanzhankang : 不是一分钟吗?
wx---每日佳选
wx---每日佳选
建议把IP存到缓存里。这样读取速度会快很多。数据库的压力也会下来一些。
华兹格
华兹格
回复 @Jackin : 你这样意义不大,时间粒度你没有确定。
Jackin
Jackin
IP 加时间 做唯一限制 这样 同一时间就只能有一个记录了!
0
浏览者
浏览者
这种ip限制如果是临时需求,直接丢缓存里就行了,只有ip串,io开销也不会太大。数据库基本上就唯一ip了,不会有任何压力了。
0
Arrowing
Arrowing
验证码,IP限速器
0
xxiu
xxiu
用cookie, session,提交加上随机数或验证码,ip地址限制
0
剑啸枫
剑啸枫

难道LZ 1分钟限制ip都是从db去验证的?加个memcache能减不少db的压力~至于有多条记录是并发造成的.

返回顶部
顶部