c++ - 嵌入式 Lua - 超时流氓脚本(例如无限循环) - 一个例子吗?

标签 c++ lua

我在 C++ 应用程序中嵌入了 Lua。我需要能够从占用资源中杀死流氓(即写得不好的脚本)。

我知道我无法满足导致脚本无限期运行的每一种情况,所以现在,我只关注简单的 Lua 方面(即脚本方面的问题)。

我也知道这个问题已经在 SO 上被问过(以各种形式)。可能它不断被重新询问的原因是,到目前为止,还没有人提供几行代码来说明超时(对于我上面描述的简单情况)实际上是如何在工作代码中实现的- 不要笼统地谈论它如何实现。

如果有人在带有嵌入式 Lua 应用程序的 C++ 中实际实现了这种类型的功能,我(以及许多其他人 - 我敢肯定)将非常感谢显示的一个小片段:

  • 如何在运行 Lua 脚本之前设置超时(在 C++ 端)
  • 如何引发超时事件/错误(C++/Lua?)
  • 如何处理错误事件/异常(C++ 端)

这样的片段(甚至是伪代码)确实非常非常有用

最佳答案

您需要结合多种技术来解决这个问题。首先,您需要为不受信任的脚本建立一个合适的沙箱,该沙箱的环境仅提供那些安全且需要的全局变量和函数。其次,您需要提供内存和 CPU 使用限制。第三,您需要明确拒绝加载来自不受信任来源的预编译字节码。

第一点很容易解决。在 Lua 用户 wiki、邮件列表和此处 SO 上有大量关于沙盒 Lua 的讨论。如果您知道某些脚本比其他脚本更受信任,那么您几乎可以肯定已经在执行此部分操作。

第二点是你要问的问题。我稍后会回过头来。

第三点在邮件列表中已经讨论过,但在其他媒体上可能没有说得很清楚。事实证明,Lua 核心中存在许多难以或无法解决的漏洞,但这些漏洞依赖于“不正确”的字节码来执行。也就是说,它们不能从 Lua 源代码中执行,只能从预编译和仔细修补的字节代码中执行。编写一个完全拒绝加载任何二进制字节码的加载器是很简单的。

排除了这些问题,剩下的就是通过 CPU 消耗、内存消耗或两者兼而有之的拒绝服务攻击问题。首先,坏消息。没有完美的技术可以防止这种情况发生。也就是说,最可靠的方法之一是将 Lua 解释器插入一个单独的进程,并使用您平台的安全和配额功能来限制该进程的功能。在最坏的情况下,可以终止失控进程,而不会对主应用程序造成任何损害。最新版本的 Firefox 使用该技术来包含插件中错误的副作用,因此这个想法并不一定像听起来那么疯狂。

一个有趣的完整示例是 Lua Live Demo .这是一个网页,您可以在其中输入 Lua 示例代码,在服务器上执行它并查看结果。由于脚本可以从任何地方匿名输入,因此它们显然不受信任。这个 Web 应用程序似乎是安全的,可以要求。它的源工具包是 available for download来自 Lua 的一位作者。

关于c++ - 嵌入式 Lua - 超时流氓脚本(例如无限循环) - 一个例子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5134287/

相关文章:

python - 在 BOOST_PYTHON_MODULE 宏之外将 C++ 实例传递到 Python

c++ - 如何强制链接器使用共享库而不是静态库?

redis - 为什么 nil 检查失败

c - 如何包装一个参数是指向结构的指针的C函数,以便它可以从Lua调用?

arrays - 在Lua中寻址数组中的索引

c++ - 有没有一种方法可以在不使用两个 for 循环的情况下迭代两个容器

C++ 程序在链接期间获取对动态 C 库的 undefined reference

c++ - 从基类转换为派生类

inheritance - Lua 继承 - 在 super 上调用方法

lua - a, b = foo() 在 Lua 中是什么意思?