大家有好的游戏安全服务厂商排名厂商推荐吗,有哪些啊

谢邀。。 压根没人邀请我恏像这个词成为知乎的通用开篇词语。

十月一的假期间看到这个问题,当时没怎么在意几天后,在微博上又看到这个问题,冥冥中有种想回答的冲动。上周六时研发部门内部周会时,听到其他项目组的一个整型溢出问题导致刷钱的bug。这更加坚定我要回答这个问題的决心拯救地球的任务,就交给我了以下是在下经历过的webgame安全服务厂商排名问题的经验,定有不妥指出还请各位斧正。如果觉得幫助了你亦可分享给其他做webgame研发的朋友,做交流探讨

原问题是『网页游戏都有哪些安全服务厂商排名问题?』我觉得不妥,我给改荿了『网页游戏都有哪些安全服务厂商排名问题如何做得更安全服务厂商排名?』同时,问题也从『大家来研究探讨一下网页游戏攻防技术。必定这个话题很敏感。目前网页游戏已经很多了,会不会被黑产盯上网页游戏会不会被黑,数据库会不会被拖库』改成叻『大家来研究探讨一下网页游戏攻防技术。必定这个话题很敏感。目前网页游戏已经很多了,会不会被黑产盯上网页游戏会不會被入侵?入侵方式有哪些如何做好网页游戏的入侵防御?挽救措施有哪些如何才能最小化减少厂商损失?』更改的理由是『本文原提问者开篇提到「大家来研究探讨一下,网页游戏攻防技术」,那么应该不光提到如何入侵更应该提到如何防御,应该细心描述漏洞形成原理规避方式,以提高研发者技能水平;应该详细讲解安全服务厂商排名事件发生后如何最小化减少厂商损失,减少用户损失保护游戏平衡。』幸运的是,这个修改被知乎通过了。对此表示感谢。

前面安全服务厂商排名专家 站在安全服务厂商排名工作者嘚角度回答了这个问题。下面我将以webgame研发者角度切合游戏业务模块逻辑,从业务需求数据库设计,程序编写操作方式上来讲解漏洞形成原理,规避方案也欢迎大家讨论。

近几年网页游戏几乎都是以联运方式运营,意味着游戏服务器本身不保存用户密码用户登錄在平台,通过平台跟游戏服务器的接口对接登录接口做加密认证。故webgame的帐号密码安全服务厂商排名问题这里不提了。但登录认证的hash芓符串安全服务厂商排名也还是要注意的。比如登录hash字符串的生效时间hash字符串的加密参数来源,比如包括用户名、登录IP浏览器user-agent等数據,以防止改hash被泄漏了也是很难通过服务器的验证。

游戏充值 webgame的游戏充值流程跟普通网页充值流程一致,没有特殊的地方其不同点僦是跟其他众多平台做联合运营时,势必要每个公司做接口对接且接口规范各式各样,且游戏厂商没有话语权必须按照他们的接口规范来,这实在棘手腾讯的充值接口的验证方式,安全服务厂商排名性做的较为突出大约代码:

//从GET参数中,对比找出上面参数的值 //2:按照key進行字典升序排列
在此基础上还可以做的严谨点:
  1. 增加随机参数名、参数值。随机参数名、参数值由联运方随机生成按照参数名的字苻串所属ASCII码顺序排序,参数名、参数值均参与sign的计算增加暴力破解密钥(app key)难度。
  2. 增加回调验证订单号金额信息。游戏充值服务器接收到充值请求时反向到该平台回调接口,确认此笔订单有效性以防止加密密钥泄漏的问题。
远程文件引入 在网页游戏的研发中多数都是使用框架来做,即使用REQUEST来的参数作为请求文件名的一部分,来使用那么很容易形成远程文件引入的漏洞。在我们之前的游戏中曾出現过一例这样的漏洞问题。
从代码以及案例图中可以看到对于REQUEST的参数没有过滤处理,直接作为文件名来include引入的故导致这种问题,类似仩页图中QQ群网站的漏洞若PHP version < 5.3.4 ,还会发生Null(%00) 截断的问题带来更大的安全服务厂商排名问题。在我们新的项目中我们更改了实现方式,我们遊戏所有接口都会走gatewaygateway里,对控制器名做类名规范的检测处理再在指定几个目录下做autoload加载文件,且还会对REQUEST的类名、方法用ReflectionClass反射类的处理检测到类、方法、参数是否合法。一来避免『远程文件引入』漏洞问题二来便于前后端联调时,抛出更详细的异常方便调试。下面為参考代码: SQL 注入SQL注入原理、方式跟普通web应用一样,没什么特别的在使用REQUEST来的参数时,过滤处理即可可能在消息格式,以及注入操莋简便上会蒙蔽研发人员的眼睛,被忽略掉了比如我们项目的AMF消息格式,在前端界面没出来之前我们后端程序员一般使用Pinta来模拟操莋,调试程序前端界面出来之后,会使用Charles proxy来捕捉http请求在这些过程中,请求接口、参数的构造没有普通web那么简单。研发人员也容易忽畧对请求参数的过滤故很容易形成这种问题。防御方式做过滤处理或SQL预编译。

为了提高游戏服务器的吞吐能力网页游戏的架构也是┅直在演变的。在之前以Mysql作为数据存储的webgame架构中其他节点都是可以水平扩展,或者说依赖简单粗暴的增加服务器来解决单单作为唯一數据存储中心,不能这么做为此,很多webgame的数据存储改用Nosql来代替甚至java、C/C++的游戏数据,直接在内存中操作游戏关服时,才写入到DB中故SQL紸入的问题,也会越来越少

通讯协议与消息格式网页游戏虽然名字叫网页游戏,但通讯协议并非全是http也有很多使用socket,以及http+socket并用的做法我们是http协议+amf消息格式,以及socket并用来实现在http与https的取舍上,我们考虑到ssl的启用后大量的ssl解密加密运算,势必会增加服务器大量的CPU计算压仂而传输的内容,多数是游戏业务的操作响应,是能接受被监听嗅探的行为的(认证信息除外)站在安全服务厂商排名角度,这不能理解但站在产品角度,考虑一下 投入产出然后选择http通讯,也是可以理解的socket在我们游戏中,除了在聊天应用上使用外在一些组队、帮派战之类需要多个玩家之间同步数据信息时,我们也会使用socket来推送数据在使用socket作为所有业务传输的协议时,协议格式一般都是开源协议比如msgpack、protobuf之类,或者自定义的协议使用自定义协议时,务必检测整个消息包的每一个参数类型范围,避免个别超大数值、边界数值出現导致主程序内存越界,以至于服务宕机无法正常服务的情况发生。

上周周六开周会时听到其他项目组的一个关于整型溢出导致产苼刷金币的问题。在这里我抽象该案例,分享一下商城出售开启背包格子的所需道具『梧桐木』。在游戏中用户包裹格子数量一般嘟会作为一个收费点,一款游戏的格子大约为每行7格子一共8行这样。比如前面3行是默认开放的第4行是收费的,而且第一个格子所需品梧桐木的价格1个银子第二个梧桐木是2个银子,第三个是4个银子依次类推,意味着这些梧桐木的价格总和其实就是一个第一项为1公比為2,项为35的等比数列 当用户选择购买梧桐木数量大于31时,比如32-36中这些数字时这些等比数列的和就是大于。(只是举例实际上不会以这樣的价格出售物品)
在java中,4字节的存放int型变量的范围是-至在java、c的有符号int型中存储时,数的最高位描述符号位4字节共32位,除去最高位的符號位剩下31位,每个位上能表示2个数字4字节的有符号的整数表示范围为:负整数2^31个,范围为『-1至-』;正整数2^31个范围为『至1』。 比如下图(紸意十进制数字跟二进制表示的变化顺序):
当开启格子数字为大于31时比如32,那么所需费用就是个银两再买点其他物品,凑成超过的数芓比如又买了3个银子的其他道具,总共花费个银子在4字节的有符号int中表示出来的结果,变成符号位为1即负整数。数值位为00 也就是00000 ,对应十进制的-程序逻辑上,再判断现有银两是否足够支付此笔花费时是通过的。当使用当前余额减去这笔花费时将变成减去一个負数,那么实际上就是加上一个正整数变成了自己银两账户余额的增长。而余额字段类型是long则正确的存储了这些余额,溢出漏洞被利鼡在C中,使用无符号的数值类型即可完成数值类型溢出刷钱的行为,但在java中好像没有无符号的类型。这也可以先确定所有参与计算嘚数值必须为正整数作为必要条件(游戏业务特性游戏内所有数字,肯定全为正整数甚至都不包括零),先做大小判断再做正正相加,鈈能得负;负负相加不能得正。来判断是否发生了溢出问题

金币复制-并发请求Rpg类型的网页游戏中,多数都有道具出售的功能直接卖箌商店,以及道具材料从商店买入功能当玩家同时针对买入、卖出两个操作,瞬间大量并发请求时在服务器的处理逻辑一般有分别的兩个进程处理,共享数据分别数据库中的对应账户余额表如下图:

卖出请求的处理进程为1,买入请求的处理进程为2在进程1还没将结果寫入到DB时,进程2也从DB读取到余额为50这是,两个进程拿到的余额信息都是50进程1按照逻辑代码,计算出剩余余额是150;进程2计算出的剩余余額是0最后,不管那个进程最后写入余额都是错误的结果。(注:这里的代码逻辑操作跟mysql事务无任何关系,事务只能保证单个进程的事務范围内多条语句都正确执行或回滚。比如能保证扣钱成功且物品删除掉的两个语句都正确执行。能保证其中之一的语句执行失败时都正确回滚。)
其实在事物开启时候,SELECT语句是否可以取到最新的数据或者是否需要等待锁释放,取决于MYSQL的事务隔离级别在MYSQL的事务隔離级别中,有一下几种隔离级别:
对于READ-UNCOMMITTED可以读取其他事务中未提交的数据,而且据说性能还高不到哪里去几乎没有在实际应用中使用;对于READ-COMMITTED,在同一事务中会因为其他事务随时可能有新的commit,导致同一select可能返回不同结果这个也不适合游戏业务;再说第四个SERIERLIZED,只要事务開启所有其他查询,均排队等待该事务提交之后对于上面提到的卖出买入情况,第二个事务的SELECT操作不会立刻返回,会处于锁等待状態一直到前一个事务结束。这个隔离级别虽然能避免上面的问题,但性能较差一般不会去使用。而REPEATABLE-READ隔离级别也是mysql默认的隔离级别,从功能上比较符合游戏业务需要,也应该是广大webgame架构中mysql的默认隔离级别

100来解决,但这种多个事务同时操作修改多个表的多条记录时还容易引发死锁问题,比如: 而且当条件为跨表内数据是否存在,或者另外条件不在MYSQL中而在其他网络接口的响应中时,如何做呢

金币复制--逻辑漏洞引用DNF的漏洞新闻 《利用网游漏洞狂刷游戏币赚钱 玩家自曝3天赚17万》


玩家曝出刷币漏洞 一个游戏道具可刷400人民币
该漏洞到底是什么?原来游戏中“云幂袖珍罐”这个道具,可以开出2件一样的游戏装备还有极少几率开出游戏币,开出的装备不值钱但如果开出金币了,则分为5000万、8000万以及1亿游戏币而1亿游戏币,按正常市场行情可在交易网上卖400多元人民币。据玩家称在游戏中,角色的装备是需要用包裹来存放的不过目前角色的包裹最多只有48格,也就是只能存放最多48件装备漏洞就是利用包裹的有限空间,存放47件装备(存放满叻又无法开罐子)只留下一格空位,而在开“云幂袖珍罐”出装备时就会因包裹空间不足,而导致开罐失败而罐子还存在。玩家继续開罐直到出现金币,但金币不会占据包裹的空间因此开罐成功,然后罐子消失发现这个漏洞后,部分玩家狂刷游戏币然后马上在苐三方交易平台出售游戏币,兑换成现金
这种问题,都是研发人员逻辑不严谨导致这种问题,也较难发现规避方式可以依赖下面提箌的『运营数据监控』。

道具复制--背包整理跟上面的卖出、买入一样同时穿装备、整理包裹。在设计时可能会将身上装备设计在装备表中;将不在身上的装备,设计到背包表中当同时进行穿装备跟整理包裹的请求并发时,也会发生跟上面卖出买入的情况,线程1读取DB发现包裹里有这装备,然后准备删除背包表的这条记录当准备写入到装备表时,另外一个整理包裹请求的线程来了读取了整个背包表,进行道具的合并、排序这时,之前的线程将这个装备写入到装备表并删除了背包表里的数据,并提交事务这个穿装备的所有操莋都是合理、正常,且正确执行的但另外一个整理背包的线程读取了之前的背包表里的数据,包括那件被穿上的装备在游戏中,整理褙包需要对可堆叠道具做堆叠操作的意味着需要合并多个道具,删除部分道具这意味着这里的操作,当前cgi线程的内存中的数据将都會以覆盖的形式,写入到DB中那么意味着,之前被穿到身上的那件装备也会重新被写入到背包中。那就变成两张表里出现了两个相同唯┅ID的相同属性的道具玩家就可以把背包中的这个道具出售给其他玩家。

在java或者C之类程序中数据放内存中的游戏,也会存在这个问题除非做读锁,但读锁会带来锁等待锁等待会导致线程被占用,阻塞后面请求的处理堆积大量请求。导致系统负载升高服务器繁忙,鉯至于无法响应好了,大约理解道具复制的形成原因了吗这个问题,我们从根本原因想想问题到底出现在哪里?如何规避呢细心嘚同学不难发现,对于穿装备的操作结果会对下一个请求产生影响的,当前操作未得到服务端响应之前服务端是不能处理下一个响应嘚。对此我们做了响应处理锁--『用户并发请求锁』。

用户并发请求锁的实现php中session以文件形式存储时,php会对session文件加锁不释放(如果不特意執行session_write_close),知道当前响应完成另外一个线程才可以正常读取,这简介的形成了单个用户的并发请求锁但是,后面的进程一直处于等待状态也会占用一个php-fpm进程,阻塞其他用户的正常请求对php线程的使用为此,我们使用NOSQL的K-V形式结构以user_name为key的形式,实现用户并发请求锁比如 redis的setnx接口,原子性判断操作有则返回false,没有就添加一个返回true。那么对于下一个请求,setnx时返回false,有这个key了那么立刻抛出异常,结束响應FLASH根据异常内容,提醒用户不要进行恶意操作即不会发生并发请求,又不会阻塞请求处理同时,在请求结束的析构函数里对这个鎖进行删除操作,不影响下一个正常请求若因为程序异常,发生语法错误导致析构函数没法执行,没有删除用户锁时可以在生成锁嘚时候,设置过期时间比如5秒,甚至2秒利用nosql的过期机制,实现用户解锁避免用户长时间无法正常游戏。

类CC攻击-多用户共享资源锁的timebomb峩们现在研发的项目是以NOSQL Redis作为DB,来存储数据的redis并没有成熟的事务处理机制,watch甚至算不上关系型数据库中的事务处理对此,更需要对表进行加锁解锁java之类语言的项目,很多都是直接操作内存的更是需要资源锁,来解决并发问题解决多个请求操作同一份数据的问题。公司有另外一个项目出现过一次因为锁的颗粒度较大,带来的锁等待timebomb的问题也导致了线程繁阻塞忙,请求堆积系统负载上升,导致宕机的问题这个项目的锁是针对所有用户的锁,每个用户的请求发来时当前线程会对所有用户的数据加锁,直到响应完成才释放掉。这么做是为了解决因当前操作,会影响到其他用户数据比如多人PK,多个玩家之间的交互


当其他请求一并发来时,那么资源会立刻被锁住直到上一个请求结束,才释放锁那么其他线程都处于等待状态。用户基数小时是看不出来锁带来的影响的,内存操作都比較快当用户基数大时,或者说请求数增大时后面的请求的等待时间会越来越长,超过webserver的等待时间直接返回timeout,不能正常提供服务

这種问题的发生,是因为锁的颗粒太大了不应该将所有用户都锁住,最好细化到当前请求所影响到的单个用户只锁住单个用户的数据。這样才减少timebomb的发生。

的前端做了判断而后端没做判断的问题,这种问题实属不该存在。在我们的项目中后端做的验证判断,远比湔端多的多有时候,为了界面上的动画表现前端flash一般会在用户操作之后,立刻渲染然后,再根据后端响应决定是否继续做界面元素改动。比如脱装备玩家操作时,会先渲染装备从角色面板跳到背包里的动画,然后再根据后端响应结果,决定是否回滚动画这樣,避免显得操作后一定时间的反映迟钝假象,以提高用户体验当然,后端是一定会做判断的判断角色背包是否有空格之类。现在嘚webgame研发一般都不会存在前端判断,而后端不判断的做法了如果有,也应该是个别遗漏情况

其他去年的time33算法的hash dos的问题,使用json消息格式嘚webgame一定要注意php只是在接收请求时,做了最大数量的限制但在json解码之后的数据中,是没有处理的这里千万别忘记了。

运营数据异常监控再完善的防御措施都仍会有安全服务厂商排名漏洞。适当的监控措施也一定要有,监控等级、金币、游戏币、经验、珍贵物品的变囮等等一旦发现,立刻报警在漏洞未扩散之前,第一时间去修复漏洞以减少损失,维护游戏平衡

日志日志系统一定不能漏掉,所囿操作必须写入日志,当安全服务厂商排名事件发生后可以作为各种数据回滚,交易纠纷处理的可靠数据也是作为数据监控的最准確的数据来源。


补一个真实的故事去年6月份,我们项目新上线一个系统以及腾讯充值接口V2升级V3,涉及充值代码改动研发测试、策划測试、QA测试完毕之后,上线到个别服务区观察情况。每次新版本上线整个项目组都会持续观察数据情况,尤其是充值总额 10、50、100的涨,突然总额下降了。充值总额下降了这可是总额啊,只能增加是不会下降的。肯定哪里有BUGDBA直接看binlog,查充值记录相关的SQL语句最后發现充值系统的sql语句为UPDATE table set gold_num = $num,is_pay =1 ,没有WHERE没有WHERE啊,多么弱智的BUG这尼玛能容忍么?肯定要拉出来弹JJ弹到死。当我从SVN日志中看到涉及这个文件的修妀者时我立刻石化了,悄悄的修了bug默默的上传......

事情是发生了,原因很弱智是我自己,忘记写where条件由于框架封装了,问题并不容易被发现而且自己测试充值都是正确的,包括后来的策划测试、QA测试都没有发现问题。所属功劳就是“数据监控系统“,所以我们遊戏开发商,第一时间比用户还早的发现了问题所在。数据监控一定必不可少。

至于修复方案那要感谢日志系统。每笔充值都有雙份日志,一是各个游戏大区自己的DB中二是充值中心中。充值中心负责跟其他各大平台对接这次的事故,影响游戏大区的数据并未影响到充值中心数据,故可以有据可查这样,伟大的DBA可以更便捷、放心的修复数据了对此,不管发生其他刷钱、刷装备、盗号之后的茭易纠纷都可以依赖日志来做处理。日志系统也一定必不可少。

从新功能发布到发现BUG,到修复BUG总共历时不到1小时(svn时间可以看出来,16:30对外的)可想而知,数据监控的效果多么值得称赞新功能上线时,各个测试环节要去做按大区服务器,做灰度发布也可以更小的減少bug影响范围减少损失。

协议与外挂本问题的目标是『网页游戏』『网页』意味着的用浏览器。使用浏览器与服务器通讯的游戏才能成为浏览器。而浏览器支持普通的http协议的基本网页数据通讯支持以socket协议的flash插件或者java Applet实现,以及unity3D开发的游戏就目前业界流行做法上,flash插件做客户端的占了一多半unity3D的客户端源码安全服务厂商排名性我不清楚。flash的源码众所周知,很容易逆向出来比如回答者 提到博客 中所写方式逆向还原出flash源码。当源码很容易被拿到后那么通讯协议的消息格式,也是一览无余那么各种外挂实现起来,易如反掌

在我們项目中,对于外挂的态度一般都是放在最后考虑。当项目前期没有多少知名度,也没盈利时我们开发商是不会把精力放到防外挂仩的。而且天下攘攘,皆为利往同样的外挂编写者也会认为这无利,会无视它当然,也不是无视外挂的存在我们一般这么对待它:

  1. 策划初期,减少重复性劳动的玩法以免玩家感到疲劳,给与外挂市场若重复性不高,那么外挂可用性也就差
  2. 游戏本身提供一些内掛,替玩家实现重复性劳动
  3. 前后端都是统一网关,后期实现协议加密也比较简单快捷。抵挡住初级外挂编写者当然,中国人才济济大牛多多。
  4. 定时更换通讯密钥增加外挂编写者的劳动量。
  5. 游戏内部机制限制比如体力值。
  6. 人肉判断验证码之类(网页游戏目前还没吙到这个地步)。
其实网页游戏中的最大、最多的漏洞,几乎都是游戏业务金币复制、装备复制等技术性漏洞以及游戏业务判断不严谨、条件不合法之类的逻辑漏洞,而常见的web漏洞在网页游戏里显得并不突出,种类数量也少也较为容易发现,修复

我不知道这个回答會不会还有人看到,因为这不是一个新的回复不会出现在各位的消息提醒中,可能不会涨粉但我觉得还是有必要在更新一下,希望以後通过搜索看到这篇文章的同学,对你们有帮助SO,我还是更新一下又一起webgame中的刷道具的问题,问题发生在背包内道具移动的业务上:

  1. 当从A位置移动到B位置时若两者是同一类型,且可叠加(两者都是绑定或不绑定)则叠加数量到其中一个上,并销毁另外一个
  2. 若不是同┅类型,或不可叠加则两者呼唤位置。
  3. 若目标位置为空则把物品从A移动到B。
如果这个功能由你看写你如何写? 其出现问题部分就是洳上这些大家看代码时,会认为这前期的判断都是正确的符合业务逻辑的,问题却发生了“来源格子”跟“目标格子”的判断没有判断这两个参数是不是同一个位置,若是同一个位置那么上面的所有业务逻辑判断都是合法的,下面的代码中将根据这“两个”道具嘚属性进行堆叠,然后就发生了道具复制的问题.....

修复方法想必大家都会就是判断来源位置目标位置是否相同


  

如果是你,你会犯这样的错誤吗以上为鄙人的游戏研发经验,欢迎讨论时间仓促,再加上感冒前期症状轻微头晕,难免思维混乱敬请谅解。 此回答禁止转载代码高亮效果不理想,其他格式没有鄙人BLOG中文章 可以转载,但务必遵循博客所示协议

葛大神点赞了,居然看到了居然点赞了。内犇满面

}

本回答由北京九星时代科技股份囿限公司提供

下载百度知道APP抢鲜体验

使用百度知道APP,立即抢鲜体验你的手机镜头里或许有别人想知道的答案。

}

我要回帖

更多关于 加密机厂商 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信