如何在浏览器中安全运行用户提供的Javascript代码?

多美

想象一个场景,我想连续调用用户提供的Javascript代码,如下面的示例所示,其中getUserResult某个用户(不是我自己)编写的函数是:

for (var i = 0; i < N; ++i) {
    var x = getUserResult(currentState);
    updateState(currentState, x);
}

如何在浏览器和/或Node.js中执行这种代码,而没有任何安全隐患?

更一般而言,如何执行不允许修改甚至无法读取当前网页或任何其他全局状态的Javascript函数?是否有类似浏览器中的“ JS虚拟机”?

JSFiddle如何确保您无法运行任何恶意代码(至少可以仿冒您的登录名,在页面的生存期内运行一个bot,如果没有做更糟糕的事情)?还是不能完全确保?

多美

经过深思熟虑,并在此主题的其他发布者的帮助下(非常感谢您的帮助!),我找到了问题的第一批答案。不过,我在这里重写了我的答案,因为它总结了概念,还为您提供了一些实际的代码供您尝试。

通常,针对此问题有两种解决方案:我们可以在隔离的环境中使用iframeWorker运行代码,因此无法读取或写入当前页面的信息(这是我的第一个主要的安全问题)。

有更完整的沙盒解决方案,例如Google Caja,(默认情况下)该代码也可以在中运行其代码iframeCaja不仅提供沙箱JS,还提供HTML和CSS。但是,似乎不再非常积极地维护它了。不确定是否有很好的支持?

WebWorker +黑名单

正如Juan Garcia所建议的那样,我将使用Web Worker API,但这不是完整的故事。即使工作人员无法直接从托管页面访问任何内容,仍然存在相当多的安全风险。该站点列出了Worker上下文中可用的所有内置插件

这个JSFiddle演示了一种在windowContext上下文之外运行代码字符串而无需通过服务器的方法,正如注释中指出的那样,这仍然是不安全的。

我对此进行了扩展,并采用了基于黑名单的方法,通过删除以下所有内容来禁用所有外部通信:

  • Worker
  • WebSocket
  • XMLHttpRequest
  • importScripts

Webworker +白名单

然而,实际上最安全的方法是白名单方法(在提及),因为它将在未来保持安全(假设任何列入白名单的全局变量的语义永远不会以允许将来访问更多内容的方式改变发布;这是一个合理的假设)。

我最终在浏览器WumpusGame中实现了白名单方法,该方法允许您在玩游戏时编写自己的AI脚本,几年前。源代码在这里您可以看到,白名单是在GuestScriptContext中维护的,而工作进程是由HostScriptContext管理的

GameScriptContext显示如何使用它。

它具有多种功能,包括来宾<br>主机通信,来宾可以在主机上执行非特权操作(如果它具有安全令牌甚至是特权操作),以及更多功能。

注意:它不能与某些扩展一起很好地使用,因为它们会阻止覆盖全局变量(当我尝试运行它时,它抱怨自己TEMPORARY是其中之一)。解决的办法是将其列入白名单,或者弄清楚如何使其与现代浏览器安全功能或仅针对安全性的扩展(例如AdBlock等)完美搭配。

从理论上讲该游戏在这里可以玩,但是由于上述原因,它似乎无法在Chrome中运行(而且我还没有尝试过其他浏览器)。

更多参考:

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在谷歌浏览器中运行自己的JavaScript

来自分类Dev

如何在运行时在浏览器中运行代码

来自分类Dev

如何在浏览器中运行代码时定义require?

来自分类Dev

如何在浏览器而不是命令行中运行Node.js代码

来自分类Dev

如何直接从Geany在浏览器中运行PHP代码?

来自分类Dev

如何在浏览器上运行 javascript?

来自分类Dev

如何在浏览器中查看本机源代码?

来自分类Dev

浏览器控制台 - 如何在每个页面重定向中包含 javascript 代码?

来自分类Dev

是否可以将javascript代码安全地发送到用户的浏览器?

来自分类Dev

您如何在浏览器中运行Jasmine测试?

来自分类Dev

如何在浏览器中运行.jar?

来自分类Dev

如何在Google Chrome浏览器中运行Postman

来自分类Dev

如何在Chrome浏览器中运行硒测试?

来自分类Dev

java如何在浏览器中运行其applet?

来自分类Dev

Javascript Engine如何在浏览器中执行Javascript?

来自分类Dev

在浏览器中启动JavaScript代码

来自分类Dev

如何在现在无法运行的浏览器上运行 ajax 代码?

来自分类Dev

如何在同一节点的不同浏览器版本中运行Selenium代码?

来自分类Dev

如何在浏览器中编辑JavaScript

来自分类Dev

如何在javascript中获取浏览器窗口大小?

来自分类Dev

如何将用户在 textarea 中输入的浏览器代码发送到 javascript 控制台

来自分类Dev

在Parse数据浏览器中安全存储用户的余额

来自分类Dev

如何在React中拦截浏览器导航并提示用户(包括浏览器导航和Tab关闭)?

来自分类Dev

如何在不使用php exec的情况下通过浏览器运行代码接收

来自分类Dev

如何在特定浏览器宽度下运行vbscript代码

来自分类Dev

如何在不使用php exec的情况下通过浏览器运行代码接收

来自分类Dev

如何编写仅可在Web浏览器上运行的JavaScript代码?

来自分类Dev

使用zuul调试在浏览器中运行的被测JavaScript代码

来自分类Dev

通过意图在android浏览器中运行javascript代码

Related 相关文章

  1. 1

    如何在谷歌浏览器中运行自己的JavaScript

  2. 2

    如何在运行时在浏览器中运行代码

  3. 3

    如何在浏览器中运行代码时定义require?

  4. 4

    如何在浏览器而不是命令行中运行Node.js代码

  5. 5

    如何直接从Geany在浏览器中运行PHP代码?

  6. 6

    如何在浏览器上运行 javascript?

  7. 7

    如何在浏览器中查看本机源代码?

  8. 8

    浏览器控制台 - 如何在每个页面重定向中包含 javascript 代码?

  9. 9

    是否可以将javascript代码安全地发送到用户的浏览器?

  10. 10

    您如何在浏览器中运行Jasmine测试?

  11. 11

    如何在浏览器中运行.jar?

  12. 12

    如何在Google Chrome浏览器中运行Postman

  13. 13

    如何在Chrome浏览器中运行硒测试?

  14. 14

    java如何在浏览器中运行其applet?

  15. 15

    Javascript Engine如何在浏览器中执行Javascript?

  16. 16

    在浏览器中启动JavaScript代码

  17. 17

    如何在现在无法运行的浏览器上运行 ajax 代码?

  18. 18

    如何在同一节点的不同浏览器版本中运行Selenium代码?

  19. 19

    如何在浏览器中编辑JavaScript

  20. 20

    如何在javascript中获取浏览器窗口大小?

  21. 21

    如何将用户在 textarea 中输入的浏览器代码发送到 javascript 控制台

  22. 22

    在Parse数据浏览器中安全存储用户的余额

  23. 23

    如何在React中拦截浏览器导航并提示用户(包括浏览器导航和Tab关闭)?

  24. 24

    如何在不使用php exec的情况下通过浏览器运行代码接收

  25. 25

    如何在特定浏览器宽度下运行vbscript代码

  26. 26

    如何在不使用php exec的情况下通过浏览器运行代码接收

  27. 27

    如何编写仅可在Web浏览器上运行的JavaScript代码?

  28. 28

    使用zuul调试在浏览器中运行的被测JavaScript代码

  29. 29

    通过意图在android浏览器中运行javascript代码

热门标签

归档