如何防止数据库收到未授权保存请求?在线点击游戏防作弊咨询
可行的校验方案
1. 接口请求签名校验
- 服务端在游戏页面加载时,给每个用户生成唯一的动态签名密钥,和用户ID、有效期绑定存在服务端Session或者Redis中,同时把密钥下发到前端
- 前端提交分数时,把
用户ID、点击次数、当前时间戳、签名密钥几个字段拼接后做哈希运算(比如SHA256),把哈希值、时间戳和原始业务参数一起传给后端 - 后端接收到请求后,先校验时间戳是否在有效期(比如5分钟内,避免重放攻击),再用同一套规则生成哈希和前端传的参数对比,不一致直接拒绝请求
注意:不要把签名算法明文写在未混淆的JS文件中,对前端JS代码做混淆加密,避免签名规则被逆向破解
2. 游戏逻辑服务端校验,弱化前端数据权重
- 不要完全信任前端传的点击次数,禁止直接把前端传的值写入数据库
- 服务端记录每个用户的游戏开始时间,同时统计理论最大可点击次数(比如普通人每秒最多点击10次,游戏时长60秒的话最大值就是600次),如果前端传的次数超过理论最大值直接判定为作弊
- 可以增加随机行为校验逻辑,比如每隔几秒让前端回传点击的时间间隔序列,后端校验间隔是否符合正常人类的点击规律,完全均匀的间隔大概率是脚本作弊
- 取消localStorage存储点击数的逻辑,改成每一次点击都发一个轻量的上报请求到服务端累计,服务端自己维护用户的点击总数,前端仅做展示用,最终入库的数值完全以服务端累计的为准
3. 临时会话绑定
- 用户进入游戏时,服务端给每个用户发放唯一的游戏会话ID,该ID和用户IP、UA、游戏开始时间绑定,且只能在本次游戏生命周期内有效,游戏结束后立即失效
- 只有携带合法有效会话ID的提交请求才会被处理,没有ID、ID已失效、和绑定的IP/UA不匹配的请求直接拒绝
4. 常规接口防护补充
- 给接口加请求频率限制,同一个用户ID或者IP1分钟内最多提交N次,超过阈值直接封禁
- 校验请求的Referer字段,只允许来自你自己游戏域名的请求,该字段可以伪造,仅作为辅助校验手段不要作为唯一依据
内容的提问来源于stack exchange,提问作者user1589375
相关产品推荐
相关产品推荐

