我有一个游戏的想法,人们可以为他们的角色输入一些简单的指令,例如player.goLeft()或player.attackInFront(),为此我可以让人们在代码框中输入代码,然后将其解析为eval ()。这很好用,但是它也允许人们通过键入诸如player.health = Infinity;之类的东西来更改自己的角色对象。或类似的东西。我有一个我想允许人们使用的功能列表,但是我不确定如何限制它仅使用它们。
我了解不让人们使用eval的全部目的是为了避免意外的跨站点脚本编写,但是我不确定如何执行此操作。如果您有任何建议,请对此发表评论。
我问周围的人该怎么做,大多数人建议以某种方式更改范围(这是我无法弄清楚的)或向我的代码中的每个函数添加一些奇怪的参数,这些参数必须是要执行的特定字符串任何功能,但这似乎很麻烦,而且由于我是使用p5js在浏览器中制作游戏的,因此只需检查一下元素并查看密码是很容易的。
基本上每个字符都有一个称为“指令”的变量,它只是一串javascript。然后,通过执行eval(playerList [i] .instruction);来执行游戏的每一帧;
tl; dr,我如何只允许执行特定功能而不允许其他功能?
编辑:我忘了提一下,我还计划向玩家提供信息,以便人们可以编写适合情况的代码。例如,将有一个名为vision的参数,它具有vision.front和vision.left等。这些变量仅表示网格中周围是否有敌人,墙壁,花朵等。有人建议我只用关键字替换一些函数,但是这会损害使用if语句并使它的行为有所不同的想法。
编辑2:很抱歉,本文中缺少代码,但是由于我的编写方式,一半的逻辑是在服务器端编写的,而另一半则是在客户端工作的。将会有点大,说实话,我不确定我的代码可读性如何,到目前为止,我还是得到了很大的帮助,对此我非常感谢。谢谢所有回答的人
最佳答案
不要使用eval()来执行任意用户输入作为代码!没有办法让您的代码运行一个函数,但阻止eval()这样做。
相反,您应该做的是制作一个供玩家使用的命令图,并将其映射为功能。这样,您可以基于地图查找来运行该函数,但是如果该函数不在地图中,则无法运行。您甚至可以通过在空格处分割字符串并将数组扩展到函数参数上来允许参数。像这样:
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
不在地图中。