游戏服务端开发之防御性编程

时间:2022-11-01 20:57:30

从毕业到现在,在游戏服务端开发工作已经有半年多的时间,从一个小小白,到现在初步入门。这半年项目的工作超忙,把这博客都给荒废了…这篇小博文,就简单梳理下,这半年开发过程中关于游戏服务端防御性编程的小心得。

  1. 指针判空
      这条果断放第一位!在学生时代,这些都是书面上的概念,大家也都懂,但是,估计也都没怎么注意到过其真正的高危险性。作为一名C++游戏服务端开发者,工作过一段时间后一定都深有体会,这个指针判空是有多重要。在服务端的所有宕机事件中,大部分的罪魁祸首都是空指针,所以,遇到指针就判,这是作为服务端开发必须要形成的编程习惯。
      
  2. 不要相信策划
      不要相信策划,指的是不要相信策划配的数值。比如,策划配的数值会不会是0?会不会配的很大,超出了数值上限?会不会配置了一写非法的字符串?配置格式是不是会出错等等。在编程时一定要做好这些防御性编程,不然如果由于策划的一个不小心配错,导致出现线上bug或者直接导致宕机,这将是非常不划算的。

  3. 上行消息的合法性验证
      对于上行消息的判断,是非常重要的。绝大部分MMO游戏的验证逻辑都是在服务端,要杜绝外挂,对上行消息的判断就是重要的一环。方便说明,以protobuf消息格式来讲。
      如果消息里面有repeated字段,先判断下这个repeated字段的长度,如果超过设定的上限,则直接返回错误。这可以防止外挂恶意填错超长的字段上来
      如果是对客户端请求的物品列表的有效性进行验证,比如a、b、c几个道具兑换一个d道具类的功能。在客户端的上行消息判断时,需要判断下消息里面的物品id是否存在重复项。

  4. 逻辑功能的处理顺序
      对于诸如道具兑换类的操作,一般流程都是先进行各种合法性验证,然后一定要先进行道具的扣除,然后日志输出,然后才能开始给道具。不能先给完道具再去扣除道具。