`
wangmingming2008
  • 浏览: 30383 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

防止客户端外挂、刷机等作x弊的处理

阅读更多
讨论区 » 工作讨论区 »
取消跟踪 引用
防止客户端外挂、刷机等的处理

由 贾 向辉 在 大约一个月 之前添加

问题:
1.玩家修改客户端cookie值
2.玩家找到平台调用游戏的url,修改其中的sessionkey和uid来冒充其它玩家
3.利用charles修改传递的参数
4.重复刷同一个操作请求,利用分布式服务器上的并行处理,不当获利。

回复 (8)
Comment
RE: 防止客户端外挂、刷机等的处理 - 由 肖 磊 在 大约一个月 之前添加

在开心猪倌的运营中,以上的问题都发生过,我们都做了一些处理措施:
1,放弃使用cookie,把cookie中要存的数据如uid,sessionKey等,都放到memcache中。并设置相应的有效时间,一般以(30-45分钟)为宜。
2,对于修改uid的情况,在获取用户信息之前 :users_getLoggedInUser 获得平台当前登录的uid,和传递过来的uid做比较,如果2个uid不一致,数据就是非法的,修改了sessionKey就请求不了平台的数据。
3,利用charles修改传递的参数:*目前只能是对后台的编码做的更严谨,不能购买的东西,通过购买的命令一定不能被购买,等*

对于以上的情况本人有2点建议:
1,对于renren类似有pfId和sessionKey的平台,我们可以吧【pfId@##sessionKey##@有效时间点】用des加密成一个字符串,flash只是做一个参数传递的作用,参数在后台解密后,再做判断和处理,这样就能解决1,2两个问题

2,优化我们amf3的参数请求形式,现在[命令,参数1,参数2.....] ,这样通过类似charles的功能能很清晰的很快的解析我们的命令形式和方式,我们可以吧我们的命令做的更复杂,让玩家看不到规律.........
Comment
RE: 防止客户端外挂、刷机等作x弊的处理 - 由 郑 文丰 在 大约一个月 之前添加

4、利用memcache的addOrIncr操作较快,正常大约1毫秒左右。
某个需要防刷的命令:在初始位置记录checkValue=addOrIncr值,
在结束位置记录checkValue2=addOrIncr值。
如果n多resin,只有一个这个防刷命令在执行,checkValue2=checkValue+1,这个可以作为一个防刷的检查条件。
如果有多个,并且是同一时间并行的,checkValue2>checkValue+1。
由此可以防刷。只要该命令的执行时间>addOrIncr这个操作的时间,这个检查就有效。一般每个命令的执行时间在10毫秒以上。所以在memcache正常的时候,一般都比较安全。
Comment
RE: 防止客户端外挂、刷机等作x弊的处理 - 由 史 亮 在 大约一个月 之前添加

防外挂的关键就是要保证客户端传来的数据是合法的。
那么如何前端数据的可信性呢。
基本思路如下:
首先前端和服务端约定好一个KEY。假设此KEY为S
那么每次前端请求关键数据时就给后台发加密后的KEY
为防止每次请求一致而被破解,最好加上时间戳
最后形成的模型大概如下:
客户端:secretkey A= md5.calc((id+authcod+systime+KEY);
服务端:secretkeyB = md5.calc((id+authcod+systime+KEY));

如果secretkeyA与secretkeyB相等,则可认为客户端为合法的
可以看到上面的假设的前提,是要确保前端不能被破解出KEY的值

三。解决方案:
     用元数据
     具体方案大概实现思路如下:
    1. 首先定义:一个KEY类
     public class SecretKEY{
        [Inspectable("hahahahhahahahahsdfsdfsdfsdf")]
        public static function get key():String{
            return ("Are you going to hack?");
        }
    }
    2.通过describeType反射出元数据的值
       public static function getKey(target:Class):String{
            var xml:XML;
            var xmlList:XMLList;
            xml = describeType(target);

xmlList = xml..*.(hasOwnProperty("@key"));

if(xmlList.length()>0){
                return xmlList[0].@value;
            }
            return null;
        }
    上述方法经验证反编译后是看不到元数据标签[Inspectable]的
    编码环境下的代码如下:

破解后的代码如下:

四需要注意的问题:
    由于FDT环境下,默认不能将元数据编译,所以需要配置一下FDT环境:
    在运行参数下加上如下参数:
    -keep-as3-metadata+=Inspectable  意思是把元数据Inspectable编译进去
    这时就可以将元数据编译进去了

防外挂方案.doc (49.5 KB)

实验工程.rar (10.1 KB)

KEY.rar (6 KB)
Comment
RE: 防止客户端外挂、刷机等作x弊的处理 - 由 李 强 在 14 天 之前添加

支持史亮的采用md5加密URL的方式,我个人建议再添加一个时间戳,将请求发送到服务器上时进行两步验证,
验证MD5的同时验证url请求时间应小于指定时间(5秒或者10秒)
DM5验证失败可以肯定是非法请求,时间戳大于指定时间,可以认定为用户进行模拟加密后的请求,或者第一次正常请求后利用工具重复攻击,由于修改参数再执行MD5加密需要时间,所以时间戳能很好解决这一问题。

考虑到时间戳不能使用客户端机器时间,建议第一次请求时将服务器时间带到客户端,并与客户端时间比较,计算出时间差,
以后发送请求时将时间差考虑进去,保证时间是以服务器时间为标准的。
为了进一步保证时间戳不暴露给客户端,可以进行再次简单加密过程,将时间差转化为随机字符串,再进行URL传递。

所以我认为安全的amf3的参数格式如下

[请求命令,用户id,...(其他一些正常请求参数),简单加密后的时间戳,md5加密后的数据串,sessionKey]
Comment Edit
RE: 防止客户端外挂、刷机等作x弊的处理 - 由 王 明明 在 14 天 之前添加

防刷情况:后台灵活处理 发现玩家刷机 对他的账号进行限时登录处理等。

比如在文丰说的:如果有多个,并且是同一时间并行的,checkValue2>checkValue+1 这个条件不成立的情况下 对账号处理。

对于利用charles工具修改client数据现象:提倡史亮的方法 对客户端数据加密 后端解密。
Comment
RE: 防止客户端外挂、刷机等作x弊的处理 - 由 贾 向辉 在 14 天 之前添加

1.特殊请求单独处理
2.通用请求进行统一的加密、过滤处理
3.请求出异常,客户端未能从服务端得到token,导致不能进行下一步
4.所有参数都加密【调试时不能加密】
Comment Edit
RE: 防止客户端外挂、刷机等作x弊的处理 - 由 王 明明 在 12 天 之前添加

一,客户端数据加密:
史亮和李强做了相关测试,证明了加密的可行性,目前需要讨论的是加密的性能问题与后期的开发资源。
(DES加密算法,java DES加密性能测试结果:100W次/98ms)

二,服务器加防刷机制:

总之,在防火墙和nginx端能够解决得了的 就尽量不要让resin服务器或程序解决去解决这个问题。

1),我们应该通过日志分析(在错误日志里标记了恶意刷机的信息),如果发现玩家恶意性攻击的话,封账号也不是长久之策,
        我们应该从硬件方面开始解决,对防火墙进行相关设置;

2),服务器方面,在nginx性能 负载能够承受得起的情况下 配置相关 需要编写脚本 这个锦帅在这方面有经验,可以考虑尝试;

3),从游戏的业务设计可以避免防刷:  
      比如:道具数量能累加的尽量设计成累加,而不用创建;在涉及到游戏币与道具数量的事务操作先对游戏币后道具更新等;

4),token(令牌)机制:(讨论的重点)

方案一:
       1,游戏初次请求,在服务器端产生 key=TOKEN+uid  value=随机字符串(或服务器当前时间),之后放入memcached,
          再把value返回给client;(TOKEN 为公共静态final常量)
       2,下一个请求到来时,用key从memcached里取出value,这里加读锁;
       3,验证从memcached取出来的value是否与client传过来的value相等,
          1),相等,创建value,替换memcached上的value,释放读锁,并继续业务处理;
          2),不相等,释放读锁,返回非法请求提示给前端。

方案二:
       1,游戏初次请求,在服务器端产生 key=随机字符串(或服务器当前时间)+uid  value=0/1(或不为null),之后放入memcached,
          再把key返回给client;
       2,下一个请求到来时,用client返回的key从memcached里取出value,这里加读锁;
          1),如果取出的value不为null,清除当前用户对应memcached的key和value,并释放读锁,
             再创建新的key 和 value 放入memcached 并继续业务处理;
          2),如果取出的value为null,释放读锁,视为非法请求返回client。

Comment
RE: 防止客户端外挂、刷机等作x弊的处理 - 由 贾 向辉 在 4 天 之前添加

令牌里面存在问题:
玩家正常的多次连续请求会被拒绝。
例如:
玩家偷菜,会连续偷多颗菜,从客户端要连续发送请求到服务器端去,服务器同时接收多个请求,分别处理。每处理完一颗,返回一颗的数据给客户端。
而不能偷一颗等一颗,偷完一颗才能偷第二颗。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics