2011-07-15 31 views
9

我正在研究一个webapp来教授编程概念。网页有一些关于编程概念的文本,然后让用户在JavaScript代码中输入文本编辑器窗口以尝试回答编程问题。当用户点击“提交”时,我分析他们输入的文本,看看他们是否已经解决了这个问题。例如,我要求他们“编写一个名为f的函数,其中增加了三个参数”。如何安全地“评估”网页中的用户代码?

下面是我在做什么,以分析用户的文本:

  1. 运行的JSLint上严格设置文本,特别而不承担浏览器或控制台功能。
  2. 如果有任何错误,请显示错误并停止。
  3. eval(usertext);
  4. 循环遍历条件以传递作业eval(condition)。示例条件是"f(1)===4"。条件来自可信来源。
  5. 显示通过/失败的条件。

我的问题:这是否足够防止安全问题?我还有什么可以做的偏执?有没有更好的方式去做我想要的?

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

+0

我不知道jsfiddle是否有任何可用的源/注释...我相信在某些时候它只是归结为不容易受到XSS或类似的网站。(XSS会*允许其他人*给出一个链接代码在该页面上评估,然后可以“运行”为实际查看该链接的用户)。 – 2011-07-15 23:12:35

+0

我必须说当我使用JSLint扫描我的JS压缩之前的问题我尝试并禁用我可以简单地代表作者的偏好而不是实际上代码问题的每个特征,然后我忽略它说的90%并查找缺少的分号等。如果我是你,我会考虑你的用户会喜欢阅读JSLint发现的'错误'。 – tomfumb

+0

这是一个好点,我会添加一个选项来关闭“文体”检查。但是我想要默认的是严格的,项目的一部分就是教干净的javascript编程。 –

回答

11

所以从我可以告诉你是否只评估一个用户的输入,这不是一个安全问题。只有当他们的输入被评估为其他用户您有问题。

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

话虽这么说,如果你确实需要,以确保他们的代码,看看谷歌卡哈http://code.google.com/p/google-caja/

+0

这是一个很好的观点。如果你有Firebug,你可以评估任何你想要的东西。 –

+1

我同意这里。用户能够操纵自己的浏览器不是安全问题。有很多方法可以做到这一点(Firebug,GreaseMonkey,复制源和编辑它等)。只有任何其他用户能够在属于不同用户的环境中执行不受信任的代码时,它才会成为安全问题,而不是在不知道该用户可能做什么的情况下创建它。 – jfriend00

+0

这实际上是一个很好的观点。 +1 – AlienWebguy

2

这是个诡异的问题。 eval()用户的代码在您的网站上没有安全的方法。

+0

是的,但考虑jsfiddle - 如何做到“采取可接受的措施”? – 2011-07-15 23:14:14

1

它不能这样做。浏览器不向网页提供API来限制在给定的上下文中可以执行哪种代码。

但是,这可能无关紧要。如果你的网站上没有任何cookies,那么执行任意的Javascript可能不成问题。毕竟,如果没有认证的概念,那么伪造请求就没有问题。此外,如果您可以确认用户意思是要执行他/她发送的脚本,那么您还应该受到保护以免受到攻击者的攻击,例如,如果只运行键入脚本的脚本并且从未通过GET或POST提交脚本数据,或者如果您包含某些具有这些请求的唯一标记以确认请求是源自您的网站的。

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

+0

有一个认证的概念,有Google用户帐户。我不知道它们是如何在GAE中实现的,但我猜Cookie存储会话共享密钥或其他东西。你能否解释一些关于区分类型化脚本和GET POST请求的内容?我如何区分? –

+0

@Nathan:如果用户在页面上输入脚本,可以安全地运行,因为我们知道用户意图提交它。但是,如果代码来自GET或POST数据,则恶意用户可以欺骗另一个用户发送该请求并运行该脚本。 (对于GET,通过链接很容易,对于POST,自动提交表单并不困难)。因此,除非您确定它们来自您的网站,这意味着您的网站表单需要包含恶意用户不能拥有的数据。查看跨站点请求伪造,并为用户提供一个秘密令牌。 – Matchu