我有一个接受 JS 插件的网络应用程序。也就是说,用户想要加载到我的应用程序中的其他人编写的 JavaScript 代码。
目前我正在使用 eval() 将他们的 JS 代码评估到运行时中,但我知道那是不安全的。有没有比 eval() 更好的方法来做到这一点?
需要明确的是,用户将我指向一个枯燥的文本文件(一个 URL),并且文件中的 JS 需要以某种方式出现。
我只知道动态导入 JS 脚本的两种方法:
- 使用 AJAX,获取 JS 代码,然后对其运行 eval()。
- 动态添加
<script>
标记到 DOM
问题的目的是找出一个是否比另一个更安全,或者是否有比上述 2 个选项更好的方法。
最佳答案
Is one of these two more secure than the other?
不,从安全 Angular 来看,它们同样糟糕(好)。
它们在细节上有所不同,这会导致采用不同的方法来提高它们的安全性,但最终两者都会在您的环境中运行由不受信任的第三方编写的代码,并享有其所有特权。它基本上是一个 persisted XSS问题。
Is there a better way than the above 2 options?
很多。这主要取决于这些插件在您的应用程序中应该做什么,谁编写它们以及谁安装(启用)它们。您作为应用程序提供者和用户都不希望任意代码对用户数据造成严重破坏。如果插件需要访问数据,您需要采取管理措施来确保只有受信任的代码才能运行,例如插件代码审计。至少您需要告知您的用户他们必须在启用插件之前信任插件作者,这会给他们带来负担。你也应该确保有 usable logs以防出现问题。
如果您真的想运行任意、不受信任的代码而不授予它访问用户数据的权限,您将需要考虑沙盒。有多种方法本质上是在代码无法突破的虚拟机中执行。
关于javascript - 将插件加载到网络应用程序中的安全/可靠方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51345601/