我正在制作(不是现在,但我对此很好奇)一款使用HTML5和JS的游戏,我想要的是人们可以插入自定义脚本,但是安全。在没有XSS威胁的情况下使用eval
function executeCustomJS(code){
eval(code);//bad
}
当然这个代码是非常糟糕的,因为如果代码是一样的东西document.location.href='http://meatspn.com'
,那么结果就会变得很...(...)
一个解决方案,我发现是逃脱(如eval
- >___eval___
)白名单中的所有关键字和un-escape关键字,例如'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);
}
我还没有作出评论中的正则表达式和事情,但是这不是问题。
让我们假设代码中的字符串不会被转义,没有函数可以通过转义字符串来实现,'eval','window','document','alert','location'不在白名单中。仍然有些人可以执行代码,如while(true){}
,他们不能执行任何代码,如document.location.href='http://meatspn.com'
。
此方法是否安全?或者,更好的方式存在与否?
如果这应该是JSON,则需要将属性名称视为字符串。 '{“Action”:...' – Kayla 2011-05-10 01:07:48
谢谢! (但我仍然好奇我的方法是否安全..) – JiminP 2011-05-10 01:12:25
@tylermwashburn它实际上是一个对象字面量。但是,JSON需要字符串中的属性。 @JiminP它是唯一的安全,如果你知道更多关于JavaScript,那么我;)。我可以看到你的白名单解析器,你已经发送给我了。我可以找到它的所有洞。你会一遍又一遍看着meatspn :) – Raynos 2011-05-10 01:13:26