gpt4 book ai didi

javascript - 如何从全局范围中切断函数

转载 作者:行者123 更新时间:2023-11-28 17:00:36 26 4
gpt4 key购买 nike

我有一个游戏的想法,人们可以为他们的 Angular 色输入一些简单的指令,例如player.goLeft()或player.attackInFront(),为此我让人们在文本框中输入他们的代码,然后我解析将其放入 eval() 中。这很有效,但它也允许人们通过输入诸如player.health = Infinity;之类的内容来更改自己的 Angular 色对象。或类似的东西。我有一个希望允许人们使用的功能列表,但我不确定如何限制它只使用它们。

我知道不让人们使用 eval 的全部目的是为了避免意外的跨站点脚本编写,但我不确定还能如何做到这一点。如果您有建议,请发表评论。

我问了周围的一些人要做什么,大多数人建议以某种方式改变范围(这是我无法弄清楚的),或者向我的代码中的每个函数添加一些奇怪的参数,这些参数需要是特定的string 来执行任何函数,但这看起来很老套,因为我是用 p5js 在浏览器中制作游戏,所以很容易检查元素并查看密码是什么。

基本上每个字符都有一个名为“指令”的变量,它只是一个 JavaScript 字符串。然后我通过执行 eval(playerList[i].instruction); 来执行游戏的每一帧;

tl;dr,我怎样才能只允许执行特定的函数而不允许执行其他函数?

编辑:我忘了提及,我还计划向玩家提供信息,以便人们可以编写适合情况的代码。例如,会有一个名为 Vision 的参数,其中包含 Vision.front 和 Vision.Left 等。这些变量只会说明网格中周围是否有敌人、墙壁、花等。有些人建议我用关键字替换一些函数,但这会损害使用 if 语句并使其表现不同的想法。

编辑2:很抱歉这篇文章中缺少代码,但是由于我的制作方式,一半的逻辑是在服务器端编写的,一半是在客户端运行的。它会有点大,说实话,我不确定我的代码的可读性如何,到目前为止我仍然得到了很大的帮助,我非常感谢它。感谢所有回答的人

最佳答案

不要使用 eval() 将任意用户输入作为代码执行!没有办法允许您的代码运行函数但又阻止 eval() 执行相同的操作。

相反,您应该做的是制作玩家可以使用的命令映射,将它们映射到函数。这样,您就可以根据 map 查找来运行该函数,但如果它不在 map 中,则无法运行。您甚至可以通过在空格处分割字符串并将数组分布在函数参数上来允许参数。像这样的事情:

const instructions = {
goLeft: player.goLeft.bind(player),
goRight: player.goRight.bind(player),
attackInFront: player.attackInFront.bind(player)
};
function processInstruction(instruction_string) {
const pieces = instruction_string.split(' ');
const command = pieces[0];
const args = pieces.slice(1);
if (instructions[command]) {
instructions[command](...args);
} else {
// Notify the user their command is not recognized.
}
};

这样,玩家可以输入诸如 goLeft 5 6 之类的内容,它会调用 player.goLeft(5,6),但如果他们尝试输入 otherFunction 20 40 它只会说它无法识别,因为 otherFunction 不在 map 中。

关于javascript - 如何从全局范围中切断函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57616796/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com