【有奖话题】谁来保障游戏服务器的安全?

7回答

【有奖话题】谁来保障游戏服务器的安全?

提问者 Lyndon丶 2016-02-01 1k浏览

网络游戏作为现在盛行的一个行业,受到众多用户的青睐。对于游戏公司来讲一个好的用户体验是非常重要的,这就需要选择一个安全稳定的服务器。目前市面上伴随着网络游戏出现大量的外挂,这些都是因为服务器与客户端没有做好安全性验证所导致的,似乎任何一款热度高的游戏都逃不了外挂的破解。在如此猖獗的服务器通信破解的形势下,游戏公司必然需要采取一些措施来保证游戏的公平性。

那么我们在游戏开发中应该如何做好游戏的安全性验证?或者说怎样才能在一定程度上防止外挂?

【活动时间】

201621-2016221(已结束)

【活动奖励】

1、被提问者采纳的回答将会获得50Q币奖励(名额1个)

2、回答内容深刻,有自己见解者获得30Q币奖励(名额2)

3、被赞次数最多的人可获得10Q币奖励(名额1)

4、按时间先后顺序,第10个回复者可获得5Q币奖励(名额1个)

【注:以上奖励名额固定,但可以重复获得,小伙伴们加油码字啦!获奖信息将于210日公布】

【活动规则】

1、参与活动回复严禁辱骂、粗口、涉黄、复制网上内容等,一旦发现取消资格。

2、回复内容管理员会进行审核,防止灌水,一旦发现恶意灌水,名额向下顺延。

3、每个账号可以多次参与回复,连续回复不得超过5层楼。

4、奖励34可叠加获得,但是奖励1和奖励2不叠加。

5、活动获奖名单将在活动结束后的3个工作日内公布。

6、此次活动最终解释权归GAD游戏开发圈外团所有。


【获奖名单】

昵称                             奖励Q币
『Home』ヽ小阳            50
稳定心态                         40
∈Φ.威士忌                      30
  QQ群号:
484290331,欢迎加入GAD核心用户群,你可以在这里对GAD目前状态提出您宝贵的建议与意见,第一时间获得有关活动的奖励情况,附有相关传送门(链接)。福利多多!赶快带着你的小伙伴们加入我们吧!

快来消灭0回答吧

{{ dataList.answer_count | view-format }}回答
  • 稳定心态 2016-02-17 20:52
    这个只能说是相对安全,不可能做到据对安全。保护用户数据,应该尽量从某些方面着手。利用有效的工具及时检查出外挂,和系统漏洞、以及不断升级code,去保证相对安全。
    4评论
  • Uda 2016-02-02 14:00
    基本上游戏从技术上是不可能杜绝外挂的,大部分还需要结合游戏设计来防止;

    技术层面:
    1. 协议层加密
    客户端与后端做数据通信时,可以自定义加密协议,对传输的内容做加密。例如:客户端发送数据时增加校验码,服务器端根据相应的算法进行校验,如果校验不通过则返回错误,算法和效验码定期更换;
    2. 定期检查数据
    定时检查数据的合理性,例如是否存在请求次数过多,是否有周期性行为,
    甚至在游戏中加入一些特定环境,诱导外挂进入,锁定外挂。
    也可以通过数据统计,从中发现异常的数据,检测是否有外挂存在。

    游戏设计层面:
    外挂的出现一般都是和利益有关,最好的治理方式就是降低外挂的收益或者增加外挂的使用成本:
    1.降低长时间重复性任务所获得收益,或者同一种获得收益的任务随时间的增加收益减少。
    2.游戏本身提供一些类似外挂的功能:比如自动打怪等辅助工具。
    0评论
  • 『Home』ヽ小阳 2016-02-15 09:59

    游戏服务器在设计和实现上的安全性问题主要可以分为以下几个大类:

    • 协议安全

    • 流程安全

    • 数据存储安全


    需要注意的是,安全性和效率以及流程的复杂程度往往是对立的,越是安全的系统,流程越是复杂,效率也越低。我们在游戏的开发过程中需要做出折中的选择,达到安全性和效率的平衡。


    协议安全

    协议安全所指的是网络数据包的安全,通常意义上讲就是指网络数据包的加密和解密,由于网络数据包传输频繁,如果使用复杂的加解密技术将会带来巨大的CPU开销,另外由于客户端程序内存有数据包加密和解密的完整代码,因此无论多复杂的加解密算法都不能阻止破解数据包事件的发生。建议对于游戏中的一般网络包不需要进行复杂的加解密过程,只对数据包进行简单编码或者不加密也是可以接受的。

    1. 使用不对称的加密算法,客户端的代码中不能包含解密的算法和密钥。

    2. 保证客户端每次加密后的数据是动态的,以防止网络数据包被它人录制以后可以再次成功使用。例如,客户端有很复杂的加密过程,并且没有解密算法,但是如果加密过程没有动态性,由于每次输入相同的用户名加密码生成的数据包是完全相同的,那么如果被别人录制了登录的数据包,就可以伪造成功的登录。在不考虑使用密保等具有动态特性的组件以外,我们也可以考虑使用验证码的机制,新建立连接以后,服务器会发送当前有效的一段特征码,客户端加密数据需要使用到这一段特征码。这样即使登录数据被别人录制以后也无法直接使用,因为新建立的连接特征码是不同的。

    3. 另外提一下关于服务器加入部分反外挂特性的功能。一般游戏服务器内部主要能够集成的反外挂方式是防止加速外挂。目前常用的反加速外挂主要有两种:

    4. 一种方式是在客户端连接服务器后,服务器会把当前的时间发送到客户端,以后客户端发送的 每个数据包都需要包含自己计算出的服务器当前时间信息,服务器如果检测到数据中描述的服务器时间 超过了实际的时间,就认为玩家有可能使用了加速外挂。这种方式相对服务器负担不大,也不容易出错,但是只能防止变速齿轮等通用外挂,对于能够自己构造协议的外挂没有效果。

    5. 另外一种方式是服务器(一般是网关)上根据玩家发送的数据包类型进行分类,同类的数据包相互之间间隔必须满足一定条件,如果玩家连续多次出现同类数据包间隔过短的情况,就会被判定为使用加速器的玩家。这种模式虽然相对比较耗费服务器资源且需要关注到游戏逻辑,但是判断比较准确,基本上能防止各种加速方式。

    6. 在开发协议函数时,需要对所有的协议参数都进行合法性检查,服务器能够通过上下文获取的数据都不应该由客户端来提供。


    流程安全

    玩家游戏中的流程安全是相当重要的一个部分。对于一般的游戏,建议最好的方式是尽量维持使用同一条经过验证的Socket(Tcp)连接进行网络通信,因为相对来说想替换别人的网络数据是一件比较困难的事,除非玩家自己的设备中了木马。说简单一点就是尽量使用同一条TCP连接,先做登录验证,然后进行游戏,中间尽量不做切换连接的流程。但是对于实际的游戏而言并不一定能完全实现游戏过程中不切换连接。有些简单的游戏就没有网关的设计,如果切换线路服务器,必然会重新进行连接。还有部分游戏由于游戏过程是基于UDP或者Http短连接的通信模型,这些模式都需要重新验证玩家的有效性。如果需要有多次验证的系统请尽量满足下面几个原则:


    1. 同一个SessionID(或者称为accessToken)最好只能通过一次验证。如果游戏类型是切换游戏服务器、线路服务器或者是进入副本服务器时需要重新验证的类型,建议每次验证的SessionID都是重新生成的。如果条件允许的话,SessionID最好还包含有效期限制,但是这个需要针对不同类型的游戏有所不同。


    2. 遇到重复登录时候,一定要先确定新用户是否合法,然后再处理老的用户。否则就会出现没有验证新用户的有效性,直接就把老用户踢掉了的设计,这样会造成整个系统的玩家都可以被别人随便踢下线。


    数据存储安全

    游戏最重要的部分是玩家游戏数据的安全性,必须要保证用户数据能够实时安全的保存。


    1. 玩家切换服务器时,必须保证切换前数据已经被成功保存之后,才能被新的服务器读取。有部分游戏设计中,在切换服务器时,不进行实际存盘动作,只是将数据缓存在DBServer上,这个模式也可以接受,但是需要注意的是如果过程中发生切换服务器失败,玩家掉线等错误状态,DBServer要能够合理的将数据保存。

    2. 出现重复登录的情况,在踢出老用户的同时需要注意保存用户数据。建议重复登录的同时,最好也拒绝掉本次新的登录,确保用户数据的成功保存、以及老用户临时数据的清理。

    3. 玩家交易等过程一定要有事务的特性,两个玩家一定要完成物品的交换之后才可能发生写入数据库的操作,这个对于单线程逻辑程序一般很少有问题,但是对于多线程逻辑的程序必须注意。

    4. 如果处理数据库的读取和写入操作采用连接池的操作方式,需要注意单个用户数据的事务性和顺序性。可以通过一个用户数据只会在一个数据库连接上处理的方式来进行限制。

    5. 如果数据库发生故障或者玩家数据异常时,需要通过玩家的操作日志让玩家的数据能回滚到一个正常的值。

    6. 提供合理的数据库备份机制,目前一般的做法是利用数据库的主从备份机制,每天凌晨对从库进行全量备份,在数据库需要回滚到某个时间点t1的时候,可以每天的全量备份数据为基础,再执行凌晨到t1的binlog。不过,现在很多云服务商都提供了这样的服务,操作起来非常便利。比如阿里云的RDS服务。

    1评论
  • 林陌 2016-02-03 23:17
    外挂,做得再好也会有人弄的,游戏还是平衡些,检测机制做好些吧
    0评论
  • (●––●) 2016-02-12 13:16
    听说延期了我赶紧过来回答一下
    我并不是专业技术 只是个专业玩家而已  技术层面的我不懂 我只知道任何游戏都不能防止外挂 
    但是有的游戏就是外挂少
    我觉得 外挂很多 第一说明这个游戏有问题 虽然不能完全杜绝外挂 但是也不至于淘宝五毛买一个外挂而且用了还不封号
    第二说明这个游戏玩的人还是比较多的  要是没人玩 谁还来研究这个游戏的外挂?
    技术上堵截外挂是一方面 游戏举报也很重要
    codol也是最近的新游戏吧 引擎也是比较久的 外挂不能说多 但是也并不少  每隔十几天就来一个封神榜
    但是根本不行 玩家看见疑似外挂的 举报了 结果十几天没反应 或者就是很明显就是外挂 然而系统未检测到异常
    还有就是外挂的处罚力度吧  现在一直传闻说心悦会员就可以解开封号 并不知道是不是真的 
    封号时间长短不能看充了多少钱吧  而且也不能说 开挂就封号7天意思一下吧
    如果证据确凿 至少180天起步吧- -
    0评论
  • ∈Φ.威士忌 2016-02-13 20:50
    群里看到的,我来凑个数。

    反外挂贯穿着整个游戏研发和运营期,尤其对网游而言是决定生死的一个重要因素。所以不光是服务器、客户端,包括策划在游戏机制上也想要去考虑防刷防作弊等。

    技术上主流的破解方法也就那些,但外挂有个显著的特征就是花样多,很多时候是道高一尺魔高一丈,防不胜防,所以别想着反外挂做到万无一失,绝对防御,应该更多的考虑系统扩展性,出现问题的时候能够有快速且有效的补救措施,这个技术方面可以参考和模仿安全卫士这类PC软件的思路。

    先说说主流的一些外挂方法:
    1. 模拟输入
    端游上比较多,autokey搞个简单的脚本就能录制和实现较为复杂的拟人交互。这种外挂从数据角度来看很难区分是玩家还是外挂,所以这类外挂主要还是靠策划对产出就行把控,只要外挂不影响游戏公平即可。有时官方还会这种外挂(内挂)来讨好玩家。从技术角度说,客户端防Hook注入,验证码,监测进程列表(从服务器更新黑名单,运营期可动态新增)。

    2. 变速齿轮
    记录器只是方便重复执行而已,但有了加速,那问题就严重了,周期性产出会被放大。但这个问题在网游中比较好处理,所有周期性计算放在服务器,客户端定期与服务器同步时间来修正。包括修改本地系统时间之内的方式,也可同步服务器时间来解决。

    3. 本地文件修改
    切勿在本地存放重要文件,防止被篡改。但有些资源配置文件、甚至游戏脚本不得不存放在本地时,就得加密,如使用AES、RSA等,加密后如何保存密钥就是个问题。也存在本地的话,那就需要另外一个密钥。硬编码在程序里,那得看你反编译做的如何,否则IDA一搜就出来了。放在服务器请求时取回,那需要协议加密。还可以将敏感配置都放在服务器,但网游配置较多,IO压力略大,也依赖于协议加密的强度。

    4. 修改内存
    一般玩家数据都放在服务器端,客户端请求过来,都按服务器端的数据来进行验证和计算,问题不会太大,切记客户端数据不可信!但客户端被修改会有很大的问题在于很多计算是不经过服务器的,比如可能会产生无限子弹、免CD技能等。常见的金山游侠、八门神器等,都是按数值来搜索,一般支持精确和模糊。明白搜索原理后,防护手段其实也就简单了。定义CustomFloat类来替换敏感数值(不管整数还是浮点),CustomFloat底层使用浮点来保存,每帧加上随机值,使用的时候减去该值,界面显示用%.0f。这是为了界面显示的数值与底层存储无关,使得搜索失效。当然CustomFloat还有很多种实现方法,比如自己管理尾数和指数。

    5. 逆向工程
    反编译破解这手段也不是谁谁都能干的,一般也是游戏做大了被人盯上。可以买个第三方工具来加壳、混淆等,这方面的技术还是比较深的,尤其对于游戏开发者而言,所以没必要自己搞。当然大厂里也有团队自己做loader,增加逆向难度。但要是被反编译后找到了某些关键功能的函数Hook上去,加密再强也形同虚设。


    上面几个好像跟服务器关联不大,还是说点跟服务器相关的吧。
    首先是协议数据包:
    1. 复制网络包,反复发送给服务器
    该请求如果有消耗和直接产出的,在逻辑层面应当有相关验证。从反外挂角度,应当增加递增的Packet ID,如果小于或等于之前的计数器则丢弃。

    2. 伪造数据
    比如修改上述的Packet ID使得协议被伪造。简单得,可以增加校验码,参考SDK平台签名方式,一般可以MD5(data+magic_num)。当然也可以使用AES或RSA这种标准的加密算法。不管是magic_num还是password都要不定期更换,防止被暴力破解(当数据包很小时并已知算法的情况下容易被尝试出来)。

    3. 伪造协议
    一般协议实现都会有个Protocol Type来指明当前数据包是什么协议,而当数据量小的情况下,部分协议容易被还原。可以对数据包填充一些随机数据来迷惑破解者,并且Protocol Type字段也得加密。

    4. 破解协议
    更有可能的是祸起萧墙,源码和协议全部泄露,那即使每次请求都换密码,在已知初始密码和协议的情况下,总是能通过协议中各数据含义来组装出新密码(换新密码后,服务器肯定会向客户端发送新密码)。底裤都被人看完了,这种只能更换初始密码和修改传输密码的协议。

    除了在底层机制上保证安全外,逻辑层也要做好相应的错误判断,这不单单是为了防外挂,这是设计到游戏服务器稳定性的问题。比如购买请求,那必须要判断金币是否足够,否则逻辑上减成负数就太二了,如果是unsigned那更完蛋,减成了数值的最大值。

    其次架构和部署上:
    1. 统一的gateway来接受客户端连接
    不要暴露内部服务器地址。比如客户端跟game server和pvp server都有连接时,而game和pvp又存在内部rpc调用时,可能就会被黑客用端口扫描器扫出相关端口,而内部服务一般为效率考虑不大会有像客户端那样强度的协议。这样风险就比较高。并且要用好iptables。

    2. MOBA玩法的服务器计算战斗
    此类服务器计算本是为了解决多玩家间的同步问题,但由于将敏感计算都放在了服务器,所以外挂基本是不太有折腾的空间。

    3. 统一的Log服务器
    为了模块划分和性能考虑,一般都会将各玩法功能分解成不同服务,如果Log也按各自服务存储,那出现问题时就需要按时间在各服务里对Log进行查询分析。所以统一到一块,方便调试检查问题,也方便后期进行数据挖掘和基于数据的反作弊检测。

    4. GM系统
    既然是持久战,那就少不了运营和客服的积极配合,而GM系统中的黑名单、封号等功能就是堵住外挂的最后一道防线。但毕竟是人肉操作,肯定抵不过批量上来的外挂机器人,这时就得交给运维或开发来分析相应外挂特征,用更新或者脚本批量等方式来亡羊补牢。

    0评论
  • ∈Φ.威士忌 2016-03-03 18:08
    Q币怎么发放?
    0评论
  • {{ answer.user.NickName }} {{ answer.profession }} {{ answer.created_at | time-format }}
    专家回答
    {{{ answer.answer }}}
    {{ answer.answer_count | view-format }}评论
加载中... 查看更多回答