使用eval()在JavaScript中执行用户输入的安全风险

时间:2009-10-30 17:07:05

标签: javascript

我打算为学生们整理一个快速网页,让他们了解JavaScript编程。在这个页面上,我想给他们一个文本框,允许他们运行JavaScript,以便他们可以看到工作语言的动态特性。但是,我很清楚在用户输入上使用eval()通常是一个非常糟糕的主意。我发布这样的页面会带来什么样的安全风险?我应采取哪些措施来减轻这些风险?

7 个答案:

答案 0 :(得分:8)

您正在承担的安全风险是,您正在从用户那里获取输入并在您网站上的脚本环境中运行它。想象一下,如果你是一个恶意破解者,无论出于什么原因有完全访问权限修改网站上运行的JavaScript。您可以执行在您的域上运行的JavaScript可以执行的任何操作(包括cookie窃取,XSS,偷渡式恶意软件等。)

您唯一可以现实地做的是减轻风险,而不是eval()用户提供的内容。试图消毒输入只允许“安全”输入是注定要失败的;几乎不可能定义什么是安全的,甚至更难以实际限制脚本(假设潜在的攻击者有一种解释性语言来掩盖他的意图)。

请注意,如果这是出于教育目的,那么一种方法就是确保所有安全漏洞无关紧要。糟糕的JavaScript无法破坏您的服务器或从您的银行帐户中窃取资金(当然,除非它在您银行的网页上)。如果托管该网页的网站没有值得窃取的cookie或会话,并且学生知道它只是一种教育资源,我认为没有什么可担心的。大多数攻击依赖于访问存储在您域中的机密信息,或欺骗域访问者以某种方式放弃机密信息(phishing攻击或类似)。为了您的目的,我认为您会没事 - 只是不要在“真实”的网站上这样做。

答案 1 :(得分:5)

它将在自己的机器上运行。只是不要让他们保存字符串并发送给其他人 - 也不要通过GET将值放在URL中(以便可以通过电子邮件发送)。

答案 2 :(得分:2)

如果它在当地的“扔掉”机器上,则风险很小。由于所有内容都在客户端运行,因此只能使用JavaScript来损害自己。最糟糕的情况是,他们可以打开Ajax个连接,但这并不比给他们带有Tamper Data插件的Firefox更有害。

简而言之,除了他们正在使用的机器之外,给他们自由统治JavaScript的风险很小(性能除外),但如果足够狡猾的话,他们仍然无法做到这一点。我建议让他们在他们自己的机器上运行它,或者在一个演示盒上运行它,你可以随时重新成像,因为它太过负载垃圾而继续运行。

现在,另一方面让他们eval访问PHP /等将是一个可怕的,可怕的想法。

答案 3 :(得分:2)

我建议您对所有用户输入evaling进行沙箱化,以防止评估的代码访问所有全局(窗口)对象属性和方法。

查看以下资源:

答案 4 :(得分:2)

您可以尝试使用JavaScript沙盒库。 Dean Edward的解决方案Caja不限制代码访问当前窗口或文档。 JSandbox库使用Web Worker Threads完全沙箱化代码执行(由于这个原因,您将无法使用DOM),但它仅适用于支持它们的浏览器。

JSandbox是异步的,因此如果您选择使用它,则需要更改代码以使用回调。

答案 5 :(得分:1)

这里确实没有严重的风险。例如,在此页面上打开firebug并输入控制台:eval("alert('hello');");,问题?不是真的。

出于演示目的,这没什么大不了的。

答案 6 :(得分:0)

这意味着用户想要在您的表单上执行的任何代码,并且在您的网站运行的域的权限下。

因此,如果有人想要在被锁定的计算机上执行代码,但是信任您的网站(例如,允许您运行活动的x控件等等),那么该人可以通过键入来执行此操作在正确的代码中使用您的站点将脚本评估到可信空间。从本质上讲,通过这样做,您证明在该页面上运行的任何内容都经过验证,对于信任您的域的人来说是安全的。 (想想IE等中的可信站点)。