Javascript Vue.js到Node.js服务器:如何保护我的POST呼叫?

Javascript Vue.js到Node.js服务器:如何保护我的POST呼叫?,javascript,node.js,vue.js,Javascript,Node.js,Vue.js,我有一个简单的单页应用程序(一个游戏),用Vue.js编写,后端是Node.js,都托管在Heroku上。Vue中的我的前端使用axios对我的后端进行api调用,它使用express和mysql库查询我的数据库并获得高分或发布新分数 我把完成的游戏给了我的朋友,他们马上意识到他们可以用邮递员或类似的人来做一个简单的发帖请求并发送一个假分数,所以我想确保它的安全 我对任何相当简单的事情都持开放态度,但我想设置一个令牌,如果匹配,我可以在Node.js中进行检查,如果不匹配,则发送403。我曾尝试

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

我把完成的游戏给了我的朋友,他们马上意识到他们可以用邮递员或类似的人来做一个简单的发帖请求并发送一个假分数,所以我想确保它的安全

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

如何保护我的post请求?

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

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

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

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

要求:

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

您很接近这个解决方案,因为您明智地为服务器和客户端选择了一种语言,Javascript将数字表示为与平台无关的64位浮点(这避免了舍入错误)此解决方案避免了延迟和异步,但不允许在需要原子服务器端更新和耦合玩家输入的情况下进行多玩家游戏。

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