2011-05-10 54 views
1

我正在制作(不是现在,但我对此很好奇)一款使用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'

此方法是否安全?或者,更好的方式存在与否?

回答

4

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

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

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

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

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

+0

如果这应该是JSON,则需要将属性名称视为字符串。 '{“Action”:...' – Kayla 2011-05-10 01:07:48

+0

谢谢! (但我仍然好奇我的方法是否安全..) – JiminP 2011-05-10 01:12:25

+0

@tylermwashburn它实际上是一个对象字面量。但是,JSON需要字符串中的属性。 @JiminP它是唯一的安全,如果你知道更多关于JavaScript,那么我;)。我可以看到你的白名单解析器,你已经发送给我了。我可以找到它的所有洞。你会一遍又一遍看着meatspn :) – Raynos 2011-05-10 01:13:26

0

公开用户可能想要做的任何事情,例如combinators,例如,一种子语言。

0

https://developers.google.com/caja/

卡哈编译器是使第三方HTML,CSS和JavaScript安全在您的网站中嵌入的工具。它支持嵌入式页面和嵌入式应用程序之间的丰富交互。 Caja使用对象能力安全模型来实现各种灵活的安全策略,以便您的网站可以有效控制嵌入的第三方代码可以对用户数据执行哪些操作。

相关问题