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

oom*_*pah 3 c++ lua

我在一个C++应用程序中嵌入了Lua.我需要能够从占用资源中杀死流氓(即编写糟糕的脚本).

我知道我无法满足导致脚本无限期运行的各种条件,所以现在,我只关注简单的Lua方面(即脚本方面的问题).

我也知道这个问题(以各种形式)在这里提出.可能之所以经常被重新询问的原因是,到目前为止,没有人提供过几行代码来说明超时(对于像我上面描述的那样的简单情况)如何实际可以在工作代码中实现 - 而不是谈论一般性,如何实施.

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

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

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

RBe*_*eig 8

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

第一点很容易解决.在Lua用户wiki,邮件列表和SO上都有大量关于沙盒Lua的讨论.如果您意识到某些脚本比其他脚本更受信任,那么您几乎肯定已经在做这部分了.

第二点是你问的问题.我马上回过头来看看.

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

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

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