gpt4 book ai didi

javascript - 在没有 XSS 威胁的情况下使用 eval

转载 作者:行者123 更新时间:2023-11-30 10:50:09 24 4
gpt4 key购买 nike

我正在制作(不是现在,但我仍然对此感到好奇)一款使用 HTML5 和 JS 的游戏,我想要的是人们可以插入自定义脚本,但要安全。

function executeCustomJS(code){
eval(code);//bad
}

当然这段代码很糟糕,因为如果代码是document.location.href='http://meatspn.com'这样的代码,那么结果会变得很...( ...)

我找到的一个解决方案是转义(如eval -> ___eval___)所有关键字,并取消转义白名单中的关键字,例如'while','for' , 'if', 'var', 'true', 'false', ... 和 'func0', 'func1', ...., 是游戏的某些东西(比如 API)并且是安全的。

例如,

function executeCustomJS(code){
code = code.replace(/(Keyword RegEx)/g,'___$1___');
/*unescape keywords in whitelist*/
eval(code);
}

我没有在评论中制作 RegEx 和其他东西,但这不是问题。

假设代码中的字符串没有被转义,没有函数可以通过转义字符串来实现,并且'eval'、'window'、'document'、'alert'、'location'不在白名单中。仍然有些人可以执行像 while(true){} 这样的代码,他们不能执行任何像 document.location.href='http://meatspn.com'.

这种方法安全吗?或者,是否存在更好的方法?

最佳答案

我建议您通过 JSON 公开有限的脚本语言。因此,记录一个脚本引擎,它要求您创建一个 JSON 对象作为您的代码。

这有很大的优势,因为它只是数据,所以不可能将错误代码注入(inject) JSON。

因此您可以为脚本代码创建某种声明性语法。例如

{
"0": {
"Action": "move",
"X": 10,
"Y": -5
},
"1": {
"Action": "emote",
"type": "dance"
}
}

现在什么是小型声明性脚本语言的良好设计是一个完全不同的问题。

关于javascript - 在没有 XSS 威胁的情况下使用 eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5944073/

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