javascript eval(),控制输入和真正的危险

javascript eval(), controlling the input & the real dangers

简介

我目前正在从事一个名为 draw.js 的项目。该项目背后的想法是将在线代码编辑器链接到绘图 space,以便您可以使用代码进行绘图。

我第一次发现 two.js 库时就有了这个想法。我想马上开始画画,但不能,因为我必须先设置文件等。设置一次文件并使用旁边的代码编辑器将其在线托管,这使得开始变得更加容易,而且最重要的是,我可以在我想要的任何地方(学校、家里等)进行操作,而无需类似的东西一个方便的USB记忆棒。

有了代码编辑器也可以更快地获得结果。所以那里只有大加分。

我必须找到一种方法来实际 运行 我放入我的网络应用程序的代码编辑器部分的代码。我在网上做了一些研究,发现最简单的解决方案是获取代码,将字符串放入变量中,然后将变量传递给 java-script.

内置的 eval() 函数

我的问题

这个解决方案完美无缺,而且设置起来超级简单。然而,在线研究以及常识告诉我,这是一个非常不安全的解决方案。

你基本上可以输入任何有效的js,它会运行。

现在这对像 $("body").html(""); 这样的东西来说是个问题,但这 不是 世界末日。像这样编辑 html 很强大,但仅限于客户端。你实际上可以通过在 chrome 中打开你的开发工具来做到这一点。

我的问题

我自己想不出这个安全漏洞有什么严重的问题。但是我并不是这个领域的专家。这就是我问这个问题的原因。

这样使用 eval() 有什么真正的危险吗?这些危险是什么?

如果有...

有没有办法修复这个安全漏洞? 也许只允许访问某些库?

如果有办法解决这个问题,请告诉我我将如何解决它?

我的建议是在 RegEx 中设置白名单模式。 例如,您可能不想允许包含某些模式的 javascript 命令,例如 \""|''\ 等等。白名单的列表可能会比黑名单的列表短得多。

假设我是您超酷的 Web 应用程序的超级合法用户,对自己进行了身份验证,并编写了您(作为应用程序的开发人员)想要 运行 的超酷脚本。当然,作为超级用户的你比我作为普通用户能做的更多。我嫉妒你的权利。

编写一个执行时的脚本应该不会太难:

  1. 伪造输入的代码,使之看起来与实际不同。
  2. 获取您的身份验证对象并将其发布到另一台服务器
  3. 从您的系统获取更多可用信息(参见 https://github.com/Valve/fingerprintjs2

除这些隐私问题外,它还可以加载来自流氓网络的广告,这些网络有能力在您和其他用户的系统上注入病毒。

基本上就是不信任任何用户代码。如果要执行用户提交的代码,请注意它只能访问有限的范围。这样的东西(沙箱)只能改变页面的特定部分。有关可用于实现此目的的库的具体示例,请参阅 https://github.com/asvd/jailed