简介
我目前正在开发一个名为 draw.js 的项目。该项目背后的想法是让一个在线代码编辑器链接到绘图空间,以便您可以使用代码进行绘图。
当我第一次发现 two.js 时,我就有了这个想法。图书馆。我想立即开始绘画,但不能,因为我必须先设置文件等。设置文件一次并使用旁边的代码编辑器在线托管它,这使得开始变得更容易,最重要的是,我可以在任何我想要的地方(学校、家里等)完成它,而无需像方便的 USB 内存棒。
拥有代码编辑器也可以更快地获得结果。所以只有很大的优点。
我必须找到一种方法来实际运行我放入网络应用程序代码编辑器部分的代码。我在网上做了一些研究,发现最简单的解决方案是获取代码,将字符串放入变量中,然后将变量传递到 java 脚本内置的 eval() 函数中。
我的问题
这个解决方案工作完美,而且设置起来 super 简单。然而,在线研究以及常识告诉我,这是一个非常不安全的解决方案。
你基本上可以输入任何有效的js,它就会运行。
现在,对于像 $("body").html("");
这样的东西来说,这是一个问题,但这不是世界末日。像这样编辑 html 很强大,但仅限客户端。实际上,您可以通过在 Chrome 中打开开发工具来做到这一点。
我的问题
我自己无法想到此安全缺陷会带来任何严重问题。然而我并不是这个领域的真正专家。这就是我问这个问题的原因。
以这种方式使用 eval() 是否存在真正的危险?这些危险是什么?
如果有的话...
有办法修复这个安全漏洞吗?也许只允许访问某些库?
如果有办法解决这个问题,请告诉我我将如何解决它?
最佳答案
假设我是您的酷 Web 应用程序的 super 合法用户,对自己进行了身份验证,并编写了您(作为应用程序的开发人员)想要运行的酷脚本。当然,你作为 super 用户可以比我作为一个简单用户做更多的事情。而且我嫉妒你的权利。
编写一个脚本应该不会太困难,执行时:
- 伪造代码输入,使其看起来不像。
- 获取您的身份验证对象并将其发布到另一台服务器
- 从您的系统获取更多可用信息(请参阅 https://github.com/Valve/fingerprintjs2)
除了这些隐私问题之外,它还可以加载来自流氓网络的广告,这些网络有能力在您和其他用户的系统上注入(inject)病毒。
基本上只是不信任任何用户代码。如果您想执行用户提交的代码,请小心它只能访问有限的范围。这样的东西(沙箱)只能改变页面的特定部分。有关可用于实现此目的的库的特定示例,请参阅 https://github.com/asvd/jailed .
关于javascript eval(),控制输入和真正的危险,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39589445/