以下列方式使用eval()的风险或责任

时间:2010-10-08 20:42:57

标签: javascript eval

我正在努力创造其中一款机器人游戏。用户创建一个机器人,然后将其与其他机器人放在战场上。

我想让用户使用javascript来编程他们的机器人。我将提供一些功能供他们调用,但他们也可以构建自己的功能。 (八九不离十)

到目前为止,我提出的唯一解决方案是使用javascript eval()函数来执行用户编写的代码。

我想知道两件事:

  1. 任何人都有任何其他建议的实现仍允许用户使用javascript编写?

  2. 用户可以使用firefox javascript调试工具无法解决这个问题吗? (即:自己不使用eval()函数)

  3. 注意:javascript代码存储在mySQL中。 ajax用于将jscript拉出并显示给用户。 ajax用于将javascript更新发送回SQL。用户提交并即将插入数据库的所有代码都通过“clean()”函数运行。

5 个答案:

答案 0 :(得分:3)

所以基本上你会允许UserA编写将在UserB的浏览器中评估的javascript?

如果是这样,那听起来是个相当糟糕的主意;)

您可以使用http://code.google.com/p/google-caja/wiki/CajaCajole等中间层来使其更安全一些。

他们可以做的一个例子是:编写javascript,它将显示您的登录页面,然后将用户名和密码发送到另一台服务器。

另一个例子是注入一个脚本标签,然后获得“完整”的有效负载,可以解决所有类型的恶作剧,如fx显示一个友好的弹出窗口与新的独家可下载门户网站游戏,你有一个特殊的处理蒸汽提供等等。只需下载并运行!然后它为某些木马cdn创建一个隐藏的iframe。 :)

答案 1 :(得分:2)

我从没想过我会这么说,但Project Narcissus可能对你有用。它是一个用JavaScript编写的JavaScript引擎。

答案 2 :(得分:2)

很酷的想法。

eval对其他脚本注入方法确实有点不利。

您可以使用Function动态创建一个功能。试试这个:

var command = "alert(123)";
var doStuff = new Function(command);
doStuff();

eval在私有范围内运行,Function在全局范围内运行。这意味着如果你有一个机器人不应该修改的内部值,如果你通过eval运行他们的逻辑,他们可能有权访问它,但如果你使用Function他们不应该访问它}。更多信息:

changing string to a function in javascript (not eval)

答案 3 :(得分:0)

可以设置许多AJAX库来自动执行返回的JS。不需要eval()。

答案 4 :(得分:0)

最重要的是让包含用户脚本的页面在一个单独的“沙盒”域中运行,该域没有来自主站点的会话cookie,可以连接到用户帐户等。

这与对提交内容的一些手动监控一起,已经消除了很多脚本注入风险。

当允许来自用户的Javascript时,在用户的浏览器上总是存在恶意代码运行的风险,但是有理由认为获取恶意JavaScript是Internet上的一般风险,并且由客户端来保护反对它。

我不会做的是eval()项目主域内用户输入的JavaScript。这打开了太多真正的攻击危险。