【问题标题】:Vue.js to Node.js Server: How can I secure my POST call?Vue.js 到 Node.js 服务器:如何保护我的 POST 调用?
【发布时间】:2019-12-24 03:44:56
【问题描述】:

我有一个用 Vue.js 编写的简单单页应用程序(游戏),后端使用 Node.js,全部托管在 Heroku 上。我在 Vue 中的前端使用 axios 对我的后端进行 api 调用,后端使用 expressmysql 库来查询我的数据库并获得高分或发布新分数。

我把完成的游戏给了我的朋友,他们马上意识到他们可以使用邮递员或类似的工具来做一个简单的发布请求并发送一个虚假的分数,所以我想保护它。

我对任何相当简单的事情都持开放态度,但我想设置一个令牌,如果匹配,我可以检查我的 Node.js,如果不匹配,则发送 403。我尝试设置环境变量带有令牌,但是如果我检查元素(如果我使用 .env 文件然后获取值),则在前端最终会在资源中显示该令牌。我也尝试了我的 config.json 文件,但显然没有办法对使用检查元素的任何人隐藏这些值。我尝试检查req.hostname,但即使我从邮递员那里发送请求,它也会返回 200。

如何保护我的发帖请求?

【问题讨论】:

  • 您无法保护 POST 请求,任何人都可能向您的服务器发送任何请求。保护客户端代码也是不可能的,因此您不能在那里隐藏令牌。真正确保高分的唯一可行方法是将游戏逻辑(的重要部分)放在服务器端,以便您可以在那里计算或至少验证分数。
  • 这个question的可能副本。

标签: javascript node.js vue.js


【解决方案1】:

问题

正如其他人所指出的,没有通用的方法来生成无法伪造的信息客户端。问题在于,无论生成此信息的规则多么复杂(例如,游戏分数必须是质数),有人可能会隔离这些规则并创建任意信息(例如,在不玩游戏的情况下伪造质数分数)。

对于游戏,这通常会导致输入处理(客户端)和游戏规则(服务器)在客户端和服务器之间分离,无法将分数生成与游戏规则隔离。然而,这会引入延迟和异步性,并且需要对客户端游戏进行大量重构 - 三个难题。

解决方案

在某些情况下存在不同的解决方案。下棋:给定一个棋盘,向客户询问尽可能少的移动次数,直到配对。移动的数量是得分,得分最低的获胜。客户端必须发送特定的移动,服务器验证结果。换句话说,客户端信息是玩家为游戏生成的全部输入。

作为通用模式,这意味着:将客户端(分数)信息定义为整个游戏输入。记录整个输入客户端并使用此输入重新运行游戏服务器端。验证结果。

要求:

  • 将输入处理与游戏规则分开,以便它可以使用预定义的输入运行。
  • 实施等效的服务器端和客户端游戏规则。
  • 消除任何随机来源!(例如,对相同的随机数生成器或服务器生成的随机数列表使用相同的种子)

您已接近此解决方案,因为您明智地为服务器和客户端选择了一种语言,并且 Javascript 将数字表示为独立于平台的 64 位浮点数(避免舍入错误)。 此解决方案可避免延迟和异步,但不允许多人游戏,其中需要原子服务器端更新和耦合玩家输入。

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 2023-01-10
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多