You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让后端API仅接收自身VueJS游戏客户端发送的axios请求

首先明确核心原则:所有运行在用户浏览器上的代码、存储在用户本地的数据、从前端发出的请求,都是用户完全可控的,不存在100%拦截伪造请求的方案。你能做的是从架构上消除伪造请求的收益,再配合多层校验把作弊成本抬到远高于作弊获得的好处,过滤掉99%以上的作弊行为。

最高优先级方案:把胜负判定逻辑全部收归服务端

这是唯一能从根源解决问题的方案,没有之一:

  • 砍掉前端主动上报“我获胜了/我失败了”的接口,前端永远不负责判定胜负,只承担两个作用:接收用户的操作输入、接收后端返回的结果做页面渲染。
  • 每局游戏开始时,后端生成唯一的对局ID,维护整局游戏的完整状态机:比如棋牌类游戏记录每一步出牌、消消乐类游戏记录每一步方块交换、跑酷类游戏记录每一次跳跃/躲避操作,所有游戏规则计算、胜负判定全部在服务端跑。
  • 等后端逻辑判定用户确实达到胜利/失败条件时,直接在服务端更新对应用户的胜/败场计数,再把结果返回给前端弹提示即可。这种架构下用户根本没有“上报胜负”的接口可以调用,就算把JWT扒出来、把请求格式摸得一清二楚,也找不到能篡改胜场的入口。
如果短期没法重构架构,用多层校验抬升作弊成本

如果暂时没法把全量游戏逻辑迁到服务端,可以叠加以下几层校验,拦住绝大多数低水平作弊:

  • 一次性对局签名机制:每次用户进入对局,后端生成一个和当前对局ID、用户ID、对局开始时间绑定的随机盐值,返回给前端存在运行时内存中(不要存localStorage/sessionStorage),盐值设置短有效期(比如单局游戏最长时长+5分钟),使用一次后立即作废。前端上报对局结果时,把对局过程的关键操作序列、结果、当前时间戳和盐值做HMAC-SHA256哈希,把哈希值作为签名一起传给后端,后端用自己存储的对应盐值重新计算哈希做比对,签名不匹配、盐值过期/已使用的请求直接拒绝。就算用户抓到一次合法请求的内容,也没法重复使用签名刷胜场。
  • 对局合理性校验:后端给每个上报的对局加逻辑校验:比如正常通关需要至少40秒,收到的请求从对局创建到上报胜利只花了3秒直接拦截;校验上报的操作序列是否符合正常人类的操作逻辑,比如1秒内出现10次以上点击、操作路径完全不符合游戏通关的最优逻辑,直接判定为无效请求。
  • 降低令牌泄露风险:把存在localStorage里的JWT迁移到加了SameSite=Strict、HttpOnly、Secure标记的Cookie中,禁止前端JS直接读取令牌,避免令牌被轻易窃取用于批量刷数据。注意这一步只能防跨站伪造请求,没法拦住用户在当前页面控制台手动发起请求。
  • 前端代码混淆+环境校验:把前端的签名生成、环境检测逻辑做高强度混淆,不要把逻辑写在明文的JS块里;加基础的调试环境检测,比如检测到开发者工具打开、页面被iframe嵌入、JS被hook篡改时,拒绝生成合法的请求签名。这部分的作用只是提高逆向成本,不要把它当成核心防护手段。
完全无效的防护方案,别浪费时间做
  • 靠CORS策略、Origin/Referer请求头做校验:这些头完全可以在构造请求时手动伪造,和合法请求没有任何区别,根本拦不住。
  • 给axios加固定自定义请求头(比如X-Client: axios、固定版本号之类):几行fetch代码就能手动加一模一样的头,没有任何防护作用。
  • 在前端JS里写死固定签名密钥:不管你把密钥藏得多深、混淆得多复杂,用户只要花时间逆向前端代码总能找到,固定密钥等于没有密钥。
  • 完全信任前端传的胜负参数:只要你接口的逻辑是收到result=win就给用户加胜场,不管加多少其他校验,总有被绕过的可能。

额外提醒:所有前端侧的校验本质都是防君子不防小人,只要胜负判定权还在前端手里,就永远有技术能力足够的用户能绕过校验刷数据,不要在前端防护上投入过多精力,优先做架构层面的调整。

内容的提问来源于stack exchange,提问作者MrBlackLord

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:54:36