我正在努力创造其中一款机器人游戏。用户创建一个机器人,然后将其与其他机器人放在战场上。
我想让用户使用javascript来编程他们的机器人。我将提供一些功能供他们调用,但他们也可以构建自己的功能。 (八九不离十)
到目前为止,我提出的唯一解决方案是使用javascript eval()函数来执行用户编写的代码。
我想知道两件事:
任何人都有任何其他建议的实现仍允许用户使用javascript编写?
用户可以使用firefox javascript调试工具无法解决这个问题吗? (即:自己不使用eval()函数)
注意:javascript代码存储在mySQL中。 ajax用于将jscript拉出并显示给用户。 ajax用于将javascript更新发送回SQL。用户提交并即将插入数据库的所有代码都通过“clean()”函数运行。
答案 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
他们不应该访问它}。更多信息:
答案 3 :(得分:0)
可以设置许多AJAX库来自动执行返回的JS。不需要eval()。
答案 4 :(得分:0)
最重要的是让包含用户脚本的页面在一个单独的“沙盒”域中运行,该域没有来自主站点的会话cookie,可以连接到用户帐户等。
这与对提交内容的一些手动监控一起,已经消除了很多脚本注入风险。
当允许来自用户的Javascript时,在用户的浏览器上总是存在恶意代码运行的风险,但是有理由认为获取恶意JavaScript是Internet上的一般风险,并且由客户端来保护反对它。
我不会做的是eval()
项目主域内用户输入的JavaScript。这打开了太多真正的攻击危险。