如何安全地“评估”网页中的用户代码?

问题描述 投票:10回答:4

我正在开发一个webapp来教授编程概念。网页上有一些关于编程概念的文本,然后让用户在javascript代码中键入文本编辑器窗口以尝试回答编程问题。当用户点击“提交”时,我会分析他们输入的文本以查看他们是否已解决问题。例如,我要求他们“编写一个名为f的函数,为其参数添加三个”。

以下是我正在分析用户文本的内容:

  1. 使用严格设置在文本上运行JSLint,特别是不使用浏览器或控制台功能。
  2. 如果有任何错误,请显示错误并停止。
  3. eval(usertext);
  4. 循环通过赋值的条件,eval(condition)。一个例子是"f(1)===4"。条件来自可靠来源。
  5. 显示通过/失败的条件。

我的问题:这是否足以防止安全问题?我还能做些什么才能成为偏执狂?有没有更好的方法来做我想要的?

如果它是相关的我的应用程序是在使用Python后端的Google App Engine上,使用JQuery,具有单独的用户帐户。

javascript security eval jslint
4个回答
11
投票

因此,如果您仅为他们评估用户的输入,我可以告诉您,这不是安全问题。只有当他们的输入被其他用户评估时,您才会遇到问题。

评估用户的输入并不比查看源,查看HTTP标头,使用Firebug检查JavaScript对象等更糟糕。他们已经可以访问所有内容。

如果您确实需要保护他们的代码,请查看Google Caja http://code.google.com/p/google-caja/


2
投票

这是一个棘手的问题。在您的网站上没有安全的eval()用户代码。


1
投票

它无法完成。浏览器不向网页提供API以限制在给定上下文中可以执行何种类型的代码。

但是,这可能无关紧要。如果您不在网站上使用任何cookie,那么执行任意Javascript可能不是问题。毕竟,如果没有身份验证的概念,那么伪造请求就没有问题。此外,如果您可以确认用户是否打算执行他/她发送的脚本,那么您也应该受到保护,免受攻击者的攻击,例如,如果您只运行键入页面的脚本而不是通过GET或POST数据提交的脚本,或者如果您在请求中包含某种特殊令牌以确认请求来自您的网站。

尽管如此,核心问题的答案仍然是它无法完成,并且用户输入永远不可信任。对不起:/


1
投票

不清楚eval()是否发生在客户端或服务器端。对于客户方:

© www.soinside.com 2019 - 2024. All rights reserved.