如何防止用户拦截数据包并修改数据后提交

roi_yu
  • 427

我有一个活动页面,canvas做的单机游戏,只在最后提交分数时与服务端交互。今天出现了一条可疑数据,疑似被抓包修改了成绩。想知道有什么方法可以解决这种问题。

12-21 更新:
谢谢大家的回答。暂时看来是没有什么方法能从根源上解决。那有什么方法可以对用户提交的数据做合法性验证呢?(就是一个canvas游戏,分数是通过帧数来计算的,用户操作就是点点点。

回复
阅读 9.2k
12 个回答

对提交的数据进行 sign验签 验签的算法用 RSA

和女神嗯嗯
  • 2.6k

前端加密其实不靠谱的,因为别人能看到你的加密算法 和 加密密钥 ,直接拿到加密的函数 js文件等等。

前端加密这种,相当于是透明的。js代码都能看到。。。

前端加密、提交都是不可信任数据!与其思考如何如何拦截一次性的非法请求,不如换个思路改一下分数生成的方法。比如这样做:用户在整个游戏的过程中的操作行为、得到的分数、截止当前的分数,加密存储在本地,最后将一整串的数据全部提交服务端,由服务端进行最终成绩计算。

不让人改不现实: JS是在别人机器上运行的. 可以考虑一下如果被人改了, 你有什么方法可以验证.

cookie
  • 17

不知道是否可以考虑使用websocket wss协议进行长连接监听提交数据

请问疑似抓包修改了数据的请求,仍然是通过前端ajax请求的吗

xdsnet
  • 7.5k

对这种数据,前端加密是无意义、无效果的。
整体的思路还是要增加中间提交交互信息,后端计算成绩。
就是这样都不能完全防止外挂的,因为外挂信息是在客户端产生的,只是操作换成了机器根据算法计算的。

签名发送,实在不行就ajax全程交互

硪对沵始终如⒈
  • 245

可以参考人机验证,由程序提交的数据,会呈现出一定的规律性。比如每次按键、点击等操作时间间距都一致。

其实吧,你都肉眼看出数据不符合正常逻辑了,那么按照你的逻辑,后端加点代码检验提交的数据不得了。

这是一个大题目,起码在我的经验里,这个东西只能结合特定业务来做。
我曾经写过一个类似的canvas小游戏,你可以把它当做打地鼠,不过坐标在一定范围随机。
前端加密是否有意义,我想意义仅限于降低可读性,让人不能一眼看穿数据格式,而对于数据合法性我认为还是需要靠后端。以下说法仅限于改包提交,其他方式我没有考虑。
我使用过的方式是前端操作回放,这种适合游戏时长短的游戏,一是这种游戏不需要苛刻到使用ws,二是回放数据不会太大。例如我的小游戏是30秒内打地鼠,所以数据不会太大。
但是需要重放,那也必须要有能够支持回放数据的数据,例如地鼠出现的位置。一是每次开局都发送一张后端生成的map过去的,二是前后端都用种子算法,后端生成种子给前端,前端根据种子生成map,然后回收数据是包含种子的hash之类的可以辨别种子的特征值,后端回放时就可以实际对比了。
当然,并不能防范前端读出map数据来生成回放数据。尤其如果是九宫格打地鼠,坐标范围固定,更加容易伪造。我的想法是使用时间戳卡死开始时间和结束时间,算出每次间隔点按是否合理,回放坐标和map坐标的差异是否合理。
即使如此,还是不能隔绝改包,只是增加了成本。
以上也可以看出,换种游戏就完全不能复用,所以意义不大,反而是自己复杂了。

宣传栏