哪些编程语言支持在有限的安全模式下运行,有哪些已知问题存在?

我想允许用户对服务器端程序进行脚本/编程。虽然我正在寻求 建议 关于如何在系统管理方面减轻安全风险,但我也想知道有哪些编程语言提供了限制用户执行危险代码的功能?

虽然我将讨论 Lua 和 Tcl,但我对其他选项也非常感兴趣;我喜欢学习新的编程语言,并且有选择余地可以选择最适合用户的编程语言是非常好的。

Lua:

Lua 具有 沙盒 功能。

作为需要开发者考虑的一个 Lua 问题的例子,有这个网页 https://www.corsix.org/content/malicious-luajit-bytecode,它介绍了字节码作为攻击的一种方法。

Tcl:

Tcl 具有创建“安全解释器”的能力: https://www.tcl-lang.org/man/tcl8.6/TclCmd/interp.htm#M12

如果指定了 -safe 开关(或者父解释器是安全解释器),则新的子解释器将作为具有有限功能的安全解释器创建;否则,子解释器将包括 Tcl 内置命令和变量的完整集合。

我没有找到关于需要开发者考虑 Tcl 的问题的太多信息。

还有哪些具有类似功能的编程语言?它们在这方面有没有已知的问题?

原文链接 https://stackoverflow.com/questions/69548046

点赞
stackoverflow用户301832
stackoverflow用户301832

在基本的安全解释器中,所有涉及到外部世界的操作(如 openexecsourceloadsocket 等等)都被隐藏(一种特殊的命名方式,意味着它们不能从解释器内部访问),从而使安全解释器默认情况下只会因为使用过度的内存或 CPU 导致一些可能的问题。

那么如何让安全解释器实际执行一些有用的操作呢?

嗯,每个安全解释器都有一个完全启用的父解释器,它可以创建解释器间别名:在安全解释器中调用控制父解释器的定义替代物的命令。可以将这些命令视为类似于系统调用(尽管更便宜!),它们可以提供应用程序希望支持的操作。当然,如果您使用这些命令的参数并打算将其视为文件名或网络地址,则需要进行一些实质性的注意,但您至少知道您只会按照预期的方式进行操作。(避免文件名问题的常见方法是仅支持抽象句柄-父级定义的简单名称,其意义仅为“您可以在这些操作中使用此名称”。这基本上就是 Tcl 的 I/O 通道句柄的工作方式。)

还有完整的 Safe Tcl 内置包,它在安全解释器中提供了一个模拟的完整解释器,允许定义可以访问的概要(例如,仅从定义的本地包存储库中读取包)。我不太确定这是否正确;它内部相当复杂。

2021-10-13 10:19:20