游戏服务器的安全性问题(一)

发表于2016-05-15
评论1 3.7k浏览
  游戏服务器在设计和实现上的安全性问题主要可以分为以下几个大类:
  协议安全
  流程安全
  数据存储安全
  需要注意的是,安全性和效率以及流程的复杂程度往往是对立的,越是安全的系统,流程越是复杂,效率也越低。我们在游戏的开发过程中需要做出折中的选择,达到安全性和效率的平衡。

协议安全
  协议安全所指的是网络数据包的安全,通常意义上讲就是指网络数据包的加密和解密,由于网络数据包传输频繁,如果使用复杂的加解密技术将会带来巨大的CPU开销,另外由于客户端程序内存有数据包加密和解密的完整代码,因此无论多复杂的加解密算法都不能阻止破解数据包事件的发生。建议对于游戏中的一般网络包不需要进行复杂的加解密过程,只对数据包进行简单编码或者不加密也是可以接受的。
  使用不对称的加密算法,客户端的代码中不能包含解密的算法和密钥。
  保证客户端每次加密后的数据是动态的,以防止网络数据包被它人录制以后可以再次成功使用。例如,客户端有很复杂的加密过程,并且没有解密算法,但是如果加密过程没有动态性,由于每次输入相同的用户名加密码生成的数据包是完全相同的,那么如果被别人录制了登录的数据包,就可以伪造成功的登录。在不考虑使用密保等具有动态特性的组件以外,我们也可以考虑使用验证码的机制,新建立连接以后,服务器会发送当前有效的一段特征码,客户端加密数据需要使用到这一段特征码。这样即使登录数据被别人录制以后也无法直接使用,因为新建立的连接特征码是不同的。
  另外提一下关于服务器加入部分反外挂特性的功能。一般游戏服务器内部主要能够集成的反外挂方式是防止加速外挂。目前常用的反加速外挂主要有两种:
  一种方式是在客户端连接服务器后,服务器会把当前的时间发送到客户端,以后客户端发送的 每个数据包都需要包含自己计算出的服务器当前时间信息,服务器如果检测到数据中描述的服务器时间 超过了实际的时间,就认为玩家有可能使用了加速外挂。这种方式相对服务器负担不大,也不容易出错,但是只能防止变速齿轮等通用外挂,对于能够自己构造协议的外挂没有效果。
  另外一种方式是服务器(一般是网关)上根据玩家发送的数据包类型进行分类,同类的数据包相互之间间隔必须满足一定条件,如果玩家连续多次出现同类数据包间隔过短的情况,就会被判定为使用加速器的玩家。这种模式虽然相对比较耗费服务器资源且需要关注到游戏逻辑,但是判断比较准确,基本上能防止各种加速方式。
  在开发协议函数时,需要对所有的协议参数都进行合法性检查,服务器能够通过上下文获取的数据都不应该由客户端来提供。

流程安全
  玩家游戏中的流程安全是相当重要的一个部分。对于一般的游戏,建议最好的方式是尽量维持使用同一条经过验证的Socket(Tcp)连接进行网络通信,因为相对来说想替换别人的网络数据是一件比较困难的事,除非玩家自己的设备中了木马。说简单一点就是尽量使用同一条TCP连接,先做登录验证,然后进行游戏,中间尽量不做切换连接的流程。但是对于实际的游戏而言并不一定能完全实现游戏过程中不切换连接。有些简单的游戏就没有网关的设计,如果切换线路服务器,必然会重新进行连接。还有部分游戏由于游戏过程是基于UDP或者Http短连接的通信模型,这些模式都需要重新验证玩家的有效性。如果需要有多次验证的系统请尽量满足下面几个原则:
  同一个SessionID(或者称为accessToken)最好只能通过一次验证。如果游戏类型是切换游戏服务器、线路服务器或者是进入副本服务器时需要重新验证的类型,建议每次验证的SessionID都是重新生成的。如果条件允许的话,SessionID最好还包含有效期限制,但是这个需要针对不同类型的游戏有所不同。
  遇到重复登录时候,一定要先确定新用户是否合法,然后再处理老的用户。否则就会出现没有验证新用户的有效性,直接就把老用户踢掉了的设计,这样会造成整个系统的玩家都可以被别人随便踢下线。

数据存储安全
  游戏最重要的部分是玩家游戏数据的安全性,必须要保证用户数据能够实时安全的保存。
  玩家切换服务器时,必须保证切换前数据已经被成功保存之后,才能被新的服务器读取。有部分游戏设计中,在切换服务器时,不进行实际存盘动作,只是将数据缓存在DBServer上,这个模式也可以接受,但是需要注意的是如果过程中发生切换服务器失败,玩家掉线等错误状态,DBServer要能够合理的将数据保存。
  出现重复登录的情况,在踢出老用户的同时需要注意保存用户数据。建议重复登录的同时,最好也拒绝掉本次新的登录,确保用户数据的成功保存、以及老用户临时数据的清理。
玩家交易等过程一定要有事务的特性,两个玩家一定要完成物品的交换之后才可能发生写入数据库的操作,这个对于单线程逻辑程序一般很少有问题,但是对于多线程逻辑的程序必须注意。
如果处理数据库的读取和写入操作采用连接池的操作方式,需要注意单个用户数据的事务性和顺序性。可以通过一个用户数据只会在一个数据库连接上处理的方式来进行限制。
  如果数据库发生故障或者玩家数据异常时,需要通过玩家的操作日志让玩家的数据能回滚到一个正常的值。
  提供合理的数据库备份机制,目前一般的做法是利用数据库的主从备份机制,每天凌晨对从库进行全量备份,在数据库需要回滚到某个时间点t1的时候,可以每天的全量备份数据为基础,再执行凌晨到t1的binlog。不过,现在很多云服务商都提供了这样的服务,操作起来非常便利。比如阿里云的RDS服务。
  长按关注黑斑马技术团队公众号


关于黑斑马游戏团队
  黑斑马游戏团队(海豚系-百纳信息技术有限公司),立志做华中地区(武汉)最有影响力的游戏团队,没有之一.黑斑马团队的核心成员都来自微软、趋势、甲骨文、腾讯、百度、阿里、盛大、网易、完美等一线互联网公司或游戏公司。我们非常欢迎湖北籍的在一线城市的优秀游戏公司打拼的优秀人才加入我们。
  黑斑马团队招聘广告
  游戏服务器开发工程师
  岗位职责:
  1、负责服务器端通讯系统、逻辑系统的设计和相关优化;
  2、解决服务器端的逻辑BUG;
  3、合理组织服务器端数据结构,并和客户端进行有效沟通。
  岗位要求:
  1、两年以上C/C++使用经验,精通C、C++语言;
  2、具有良好的OO思想;
  3、熟练运用脚本语言,如LUA;
  4、有多线程开发经验
  5、具备良好的学习能力,沟通能力,并且热爱游戏;
  6.、具有以下经验是加分项:
  a游戏服务器开发经验
  b分布式商用游戏服务器系统研发经验优先;
  c熟悉mysql,Sqlserver等常用数据库优先;
  d有Linux下开发经验者优先
  有兴趣的同学可以投递简历到hdchen@bainainfo.com

游戏服务器开发主程序
  岗位职责:
  1、负责服务器端架构设计、模块划分、团队合作和人员分工;
  2、主导制定和指导执行服务器端开发流程和标准,对服务器端软件开发质量负全责;
  3、协调与客户端、策划、公司其他技术支持部门之间的关系;
  4、开展部门培训与新人培养,搭建人才梯队;
  5、对于技术难题负责组织攻关。
  岗位要求:
  1、3年以上网络游戏/互联网行业大型项目经验,2年以上核心开发经验,1年以上团队管理经验;
  2、精通C/C++,熟悉一种以上脚本语言,精通数据结构与算法、Socket编程、多线程编程等,有较强的多线程下race condition的troubleshooting经验,能快速排查内存相关问题
  3、精通Linux环境, 精通至少一种常用数据库,如MySQL的设计、开发与优化;
  4、掌握和熟练运用设计模式,能够独立完成需求分析和high level design,程序框架搭建等工作
  5、良好的沟通能力与团队协作能力,高度的工作责任心和敬业精神。
  有兴趣的同学可以投递简历到hdchen@bainainfo.com

游戏主策划(武汉)
  招聘人数:5人
  岗位职责:
  根据公司战略与产品计划,制订手机游戏产品设计方向和开发要点,对产品进行拓展化的设计,并监督执行;
  负责制订游戏发展方向,设计相应的游戏系统规则,其中包括但不限于:游戏策划案可行性分析、主体架构起草 与细节设计、主体逻辑规则设计、各大主系统功能规划及世界观设定等;
  了解手机社区、手机游戏、手机网游行业发展走向,分析自身及竞争对手及行业情况,及时调整竞争策略;
  带领策划人员,订定或维护策划内部流程以及分工,监督策划工作的进展。
  岗位职责:
  熟悉手机游戏开发流程, 3年以上网游策划经验,有过大型手机网游主策划的完整经历的优先;
  具有较强的分析能力,深刻理解游戏的核心原理及玩家心态;
  有策划团队的管理经验,具备良好的学习能力、细致谨慎的处事作风以及团队协作精神;
  具备较高的逻辑、数字处理等抽象能力,在任何条件下都能准确把握设计重点;
  具备一定的编程、数据库或脚本编写等方面知识的优先。
  有兴趣的同学可以投递简历到hdchen@bainainfo.com

游戏客户端开发工程师
  岗位职责:
  1、开发基于cocos-2d-x的Android手机游戏
  2、完成设计文档的编写、模块功能的开发和单元测试
  3、与产品、美术以及游戏设计小组密切的合作,设计和实现一流的用户交互体验
  4、完成公司安排的其他任务
  岗位要求:
  1、1~3年工作经验
  2、深入了解面向对象编程模型,对多态、继承等基础语法概念有清晰的认识和实践经验。
  3、熟练掌握c++语言,有一年以上使用STL, pthread, xml, json等常用类库编程经验
  4、了解c++编译,有一定的调试和排错能力,能排查简单的多线程race condition问题和内存问题
  5、熟悉Visual Studio开发工具和掌握至少一种代码管理工具
  6、具有被证明的快速学习能力和较强的逻辑思维能力,沟通良好,积极上进、敏而好学,是好的团队合作伙伴
  7、有下列经验视为加分项:
  a Cocos-2d-x编程经验
  b游戏编程经验或者喜爱游戏
  c Android编程和调试经验
  dopenGL或者图形编程经验
  e 有iOS编程经验
  有兴趣的同学可以投递简历到hdchen@bainainfo.com

游戏客户端主程序
  岗位职责:
  1、开发基于cocos-2d-x的Android手机游戏
  2、完成需求分析和high level design,程序框架搭建等工作,负责重要模块编写和优化
  3、与产品、美术以及游戏设计小组密切的合作,设计和实现一流的用户交互体验
  4、带领和指导Junior engineer工作,指导他们进行模块划分和设计,负责对他们编写的代码进行review,帮助他们成长
  5、完成公司安排的其他任务
  岗位要求:
  1、4年以上工作经验
  2、必须具有以下两种以上工作经验:
  aCocos-2d-x编程经验
  bAndroid编程和调试经验
  c游戏编程经验
  3、深入了解面向对象编程模型,对多态、继承等基础语法概念有清晰的认识和实践经验,精通c++语言和多线程编程,有较高的编码质量
  4、有较强的调试和排错能力,能排查较复杂的多线程race condition问题和内存问题。能解决团队遇到的重大技术难题。
  5、掌握和熟练运用设计模式,能够独立完成需求分析和high level design,程序框架搭建等工作
  6、有一定的领导和项目管理能力,能够带领一个小团队完成交给的工作任务,并对Junior engineer提供指导。能够发现工作流程中的问题并进行优化。擅于用创造性的方法解决问题。
  7、有下列经验视为加分项:
  aopenGL或者图形编程经验
  b掌握至少一门脚本语言,特别是lua或者python
  c了解或者有java编程经验
  d有iOS编程经验
  有兴趣的同学可以投递简历到hdchen@bainainfo.com

游戏测试工程师
  岗位职责:
  1、负责SLG/棋牌/休闲类手机游戏的质量保证;
  2、测试用例的编写和执行, 与策划,美术以及开发工程师沟通,确保产品的质量。
  任职要求:
  1、熟悉测试的各个环节,包括需求分析,用例设计,bug管理等等;
  2、熟悉android系统;
  3、有手机游戏测试经验优先
  有兴趣的同学可以投递简历到hdchen@bainainfo.com

美术界面设计师(武汉)
  岗位职责:
  完成游戏产品的图形界面需求。根据产品策划与UI的设计方案,深入了解产品用户的特点,进行游戏产品的图形界面风格设计并执行实现。针对产品情况进行界面资源规划,对相应的工作工具进行优化,提高工作品质与效率。
  制定产品界面视觉风格,并主导/参与执行、输出,确保按品质最终实现;
  能与各职能部门紧密合作;共同优化设计方案、提高产品品质;
  有效规划管理界面资源,并能对界面编辑器等工具、方法进行合理优化。
  任职要求:
  岗位要求
  本科(含本科)以上学历,两年以上游戏界面从业经验,有主导进行产品界面设计经验;
  优秀的设计能力,出色的沟通能力和团队协作能力,迅速高效的执行力;
  工作态度积极主动,性格谦和,待人真诚、宽容;
  热爱游戏,至少精通一种手机游戏。
  有兴趣的同学可以投递简历到hdchen@bainainfo.com

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引