我有一个活动页面,canvas做的单机游戏,只在最后提交分数时与服务端交互。今天出现了一条可疑数据,疑似被抓包修改了成绩。想知道有什么方法可以解决这种问题。
12-21 更新:
谢谢大家的回答。暂时看来是没有什么方法能从根源上解决。那有什么方法可以对用户提交的数据做合法性验证呢?(就是一个canvas游戏,分数是通过帧数来计算的,用户操作就是点点点。)
我有一个活动页面,canvas做的单机游戏,只在最后提交分数时与服务端交互。今天出现了一条可疑数据,疑似被抓包修改了成绩。想知道有什么方法可以解决这种问题。
12-21 更新:
谢谢大家的回答。暂时看来是没有什么方法能从根源上解决。那有什么方法可以对用户提交的数据做合法性验证呢?(就是一个canvas游戏,分数是通过帧数来计算的,用户操作就是点点点。)
前端加密、提交都是不可信任数据!与其思考如何如何拦截一次性的非法请求,不如换个思路改一下分数生成的方法。比如这样做:用户在整个游戏的过程中的操作行为、得到的分数、截止当前的分数,加密存储在本地,最后将一整串的数据全部提交服务端,由服务端进行最终成绩计算。
对这种数据,前端加密是无意义、无效果的。
整体的思路还是要增加中间提交交互信息,后端计算成绩。
就是这样都不能完全防止外挂的,因为外挂信息是在客户端产生的,只是操作换成了机器根据算法计算的。
可以参考人机验证,由程序提交的数据,会呈现出一定的规律性。比如每次按键、点击等操作时间间距都一致。
其实吧,你都肉眼看出数据不符合正常逻辑了,那么按照你的逻辑,后端加点代码检验提交的数据不得了。
这是一个大题目,起码在我的经验里,这个东西只能结合特定业务来做。
我曾经写过一个类似的canvas小游戏,你可以把它当做打地鼠,不过坐标在一定范围随机。
前端加密是否有意义,我想意义仅限于降低可读性,让人不能一眼看穿数据格式,而对于数据合法性我认为还是需要靠后端。以下说法仅限于改包提交,其他方式我没有考虑。
我使用过的方式是前端操作回放,这种适合游戏时长短的游戏,一是这种游戏不需要苛刻到使用ws,二是回放数据不会太大。例如我的小游戏是30秒内打地鼠,所以数据不会太大。
但是需要重放,那也必须要有能够支持回放数据的数据,例如地鼠出现的位置。一是每次开局都发送一张后端生成的map过去的,二是前后端都用种子算法,后端生成种子给前端,前端根据种子生成map,然后回收数据是包含种子的hash之类的可以辨别种子的特征值,后端回放时就可以实际对比了。
当然,并不能防范前端读出map数据来生成回放数据。尤其如果是九宫格打地鼠,坐标范围固定,更加容易伪造。我的想法是使用时间戳卡死开始时间和结束时间,算出每次间隔点按是否合理,回放坐标和map坐标的差异是否合理。
即使如此,还是不能隔绝改包,只是增加了成本。
以上也可以看出,换种游戏就完全不能复用,所以意义不大,反而是自己复杂了。
对提交的数据进行 sign验签 验签的算法用 RSA