如何防止第三方向Vercel无服务器函数发送非法请求?
问题分析与解决方案建议
核心问题本质
你当前的认证逻辑仅验证了用户身份合法性,但未验证分数来源的真实性——无法确认提交的分数是用户实际通过游戏产生,还是手动伪造的请求。这并非认证逻辑的根本性错误,但需要补充业务层面的防篡改校验。
无需完全重构认证逻辑,可通过以下方式修复:
1. 引入游戏会话令牌机制
- 游戏开始时,后端生成与当前用户绑定的一次性游戏会话令牌,和JWT一同返回前端。该令牌仅能用于一次分数提交。
- 游戏结束提交分数时,前端需同时携带JWT(验证身份)和会话令牌(验证是本次合法游戏的提交)。后端先校验JWT有效性,再检查会话令牌是否属于当前用户且未被使用,验证通过后处理分数,并标记令牌失效。
2. 对分数进行签名校验
- 游戏结束计算出分数后,前端用前后端共享的临时密钥(密钥需通过游戏开始时的接口动态获取,不能硬编码在前端代码),对「分数+用户ID+游戏会话ID」进行HMAC签名。
- 后端收到请求后,用相同密钥和算法重新计算签名,对比一致则处理分数,不一致直接拒绝。
3. 后端添加分数合理性校验
- 根据游戏规则设置分数合理范围,比如单局最高上限、关卡分数阈值,超出范围直接拒绝提交。
- 记录用户历史分数趋势,短时间内出现异常暴涨的分数(如从100分跳至10000分),触发人工审核或直接拒绝。
4. 强化Cookie安全属性
- 将Cookie的
SameSite设为Strict或Lax,限制Cookie仅在同域请求中发送,降低Postman等工具直接复用Cookie的可能性(注:用户仍可手动复制Cookie值,此为辅助手段)。 - 开启Cookie的
Secure属性,确保仅在HTTPS下传输,降低令牌被窃取的风险。
总结
无需完全重构现有的用户名认证逻辑,只需在游戏会话管理和分数校验层面补充机制,即可有效防止伪造分数的问题。这些方案均可在Vercel无服务器架构下实现,无需大幅改动现有代码结构。
内容的提问来源于stack exchange,提问作者Gabin
相关产品推荐
相关产品推荐

