我正在制作(不是现在,但我仍然很好奇这个)使用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'
。
这种方法安全吗?或者,是否存在更好的方式?
答案 0 :(得分:4)
我建议您通过JSON公开有限的脚本语言。因此,请记录一个脚本引擎,该引擎要求您创建一个JSON对象作为代码。
这有一个很大的优势,就是不可能将错误的代码注入JSON,因为它只是数据。
因此,您可以为脚本代码创建某种声明性语法。例如
{
"0": {
"Action": "move",
"X": 10,
"Y": -5
},
"1": {
"Action": "emote",
"type": "dance"
}
}
现在,一个很小的声明性脚本语言的优秀设计是一个完全不同的问题。
答案 1 :(得分:0)
将用户可能希望做的任何内容展示为combinators
,例如子语言。
答案 2 :(得分:0)
https://developers.google.com/caja/
Caja编译器是一种可以安全地嵌入您网站的第三方HTML,CSS和JavaScript的工具。它支持嵌入页面和嵌入式应用程序之间的丰富交互。 Caja使用对象功能安全模型来实现各种灵活的安全策略,以便您的网站可以有效地控制嵌入式第三方代码可以对用户数据执行的操作。