首先说一下这样子的疑惑活动规则。
规则其实很简单:页面上根据一定规律或者概率出现一些宝藏(flash或者图片),你点击之后会对你当前用户进行奖励,比如增加用户积分或者可以计数并且兑换显示奖品等等。
我做过两次这样子的活动,第一次非常成功,基本上不存在作弊;而第二次简直是惨不忍睹,作弊的一片一片的,如果不是因为每天挖宝数量有限制,我相信数据库早就崩溃了~
整理了一下,原因有如下几点:
1.规则验证不够
2.检验方法不当
3.前期没有规划好~
放开第三点不谈,我们来谈谈前两点。
无论如何有一点必须要确认,就是最后对数据库操作一定是需要PHP对数据库进行操作。所以,最后的操作一定会出现在某个PHP文件中。那么首先在这个操作数据的PHP文件一定要进行条件判断
然后,既然出现Flash或者图片,那么就需要有觉悟,这个Flash或者图片用户一定可以得到。那么对于Flash的加密是必须的,否则得到Flash解开就能看到所有的操作。
第三、不要指望第二点中的加密就可以防止用户获取真实的加分PHP文件的地址。不要忘记了,嗅探器到处都是。
OK,现有情况分析清楚了~~总结出来就是一句话,加分的PHP文件,只要用户有心,他一定可以得到~
所以,现在所有的问题都出现在一个地方,对这个PHP文件进行条件判断。
当然,这个具体都需要对某个活动进行分析,不过,以下两点还是需要的
- 用户是否登录
- 用户是否可以进行加分。如果有些活动每天只能规定数量不能超过20,那么你必须判断有没有超过20
那么,是不是做到这些就够了?肯定不是了~
如果一个人他只拿到1个,然后他不断的访问这个PHP文件,不就会慢慢的增加了?那么对于其他用户肯定是不公平的~
我一直都认为我很驽钝,这次再次让我验证了~其实这个地方也很好办。
回归到挖宝的规则,我们可以发现,这个挖宝的东西怎么来的呢?其实很简单,那就是在某个页面生成,然后出现了Flash,我们点击了Flash之后才可以拿到这个宝石~整个过程有三个过程,Flash仅仅是起到了中间的作用,连接了加分PHP和页面罢了~所以,我们可以采用非常简单的办法来判断我们访问这个加分PHP文件之前,是否在某个页面生成过让你点击获取加分Flash!!所以,我们可以通过页面的URL和一个当前时间戳的值来给一个确定存在的宝石“验明正身”。我们在点击页面出现的Flash或者图片时候,会在后台传递这两个值来给文件判断。首先,这个宝石是否存在!如果不存在自然可以判断你是作弊;第二:这个宝石是否被人领取过了。正常情况,当然不会被人领取!如果是你已经领取过了然后重复访问的话,那么绝对可以判定是作弊!!
OK,到现在为止,我么成功的使用数据库来防止了用户作弊。
当然,如果为了防止一个页面过多的出现宝石(有无聊人会顶住一个页面刷新),也可以在生产宝石的过程中进行判断,同一个页面对应的时间戳是否大于某个值(比如3600,也就是一个小时),如果是,那么就生成新的数据库记录;否则,不生成相应的数据库记录,同时Flash也不会显示。这样子就可以堵住一些人盯住一个页面玩命刷新的情况。
上面这种做法其实还是比较低效,因为整个过程中访问中有一次数据库还是负担比较重的:判断数据库中是否有对应的宝石记录。尤其是大量用户一起刷新页面的时候,这种现象尤其严重。如果加上一些人恶意刷新的时候,更加严重。
所以,如果条件允许的话,使用memory_cache来进行那个步骤。将url和时间戳存在memory_cache中,读取确认之后将其清除,这样子的话,效率会有不小的提升。
其实归根结底,最终的思想很简单——不要轻易相信用户的访问都是合法的,他们可能会访问一些原先没有链接的地址(比如文中的加分PHP),所以任何条件下对于所有的PHP,尤其是可以接受用户数据或者无条件直接更新数据库的文件,必须,并且是一定要进行条件判断!无论如何都不要相信用户的数据或者操作时合法的!!
还没有任何评论。