Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
嵌入式Lua-超时流氓脚本(例如无限循环)-有人举个例子吗? 我在一个C++应用程序中嵌入了Lua。我需要能够杀死盗贼(即写得不好的脚本)从占用资源_C++_Lua - Fatal编程技术网

嵌入式Lua-超时流氓脚本(例如无限循环)-有人举个例子吗? 我在一个C++应用程序中嵌入了Lua。我需要能够杀死盗贼(即写得不好的脚本)从占用资源

嵌入式Lua-超时流氓脚本(例如无限循环)-有人举个例子吗? 我在一个C++应用程序中嵌入了Lua。我需要能够杀死盗贼(即写得不好的脚本)从占用资源,c++,lua,C++,Lua,我知道我不能满足导致脚本无限期运行的每一种情况,所以现在,我只关注简单的Lua方面(即脚本方面的问题) 我也知道这个问题(以各种形式)一直被问到这里。可能是因为到目前为止,还没有人提供几行代码来说明超时(对于像我上面描述的那种简单的情况)是如何在工作代码中实际实现的,而不是笼统地谈论它是如何实现的 如果有人在C++中使用嵌入式Lua应用程序实现了这类功能,我(以及许多其他人——我确信),将非常感谢一个小片段,显示: 如何在运行Lua脚本之前设置(在C++侧)超时 如何引发超时事件/错误(C++

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

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

如果有人在C++中使用嵌入式Lua应用程序实现了这类功能,我(以及许多其他人——我确信),将非常感谢一个小片段,显示:

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

这样的代码片段(甚至是伪代码)将非常非常有用,事实上,

对于这个功能的实现所需要的内容,代码片段并不是一个恰当的术语用法,这就是为什么您没有看到它的原因。可以使用调试挂钩在执行Lua代码期间提供回调。但是,在超时后中断该进程是非常重要的,并且取决于您的特定体系结构

你可以考虑在LaaYaLead或LuaYpPalk之前使用一个跳到缓冲区的集合,然后在A中捕捉暂停。然后关闭Lua上下文并处理异常。超时可以通过多种方式实现,您可能已经想到了项目中其他地方使用的东西


完成此任务的最佳方法是在单独的进程中运行解释器。然后使用提供的操作系统工具来控制子进程。有关该方法的更多信息,请参阅。

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

第一点很容易解决。在Lua用户wiki上、邮件列表上以及这里的SO上都有大量关于沙箱Lua的讨论。如果您知道某些脚本比其他脚本更受信任,那么几乎可以肯定您已经在做这部分了

第二点是你要问的问题。我一会儿再谈这个问题

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

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


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

这是一个非常天真和简单的工具,但所有Lua的实现方法都很简单

-- Limit may be in the millions range depending on your needs
setfenv(code,sandbox)
pcall (function() debug.sethook(
  function() error ("Timeout!") end,"", limit)
  code() 
  debug.sethook() 
  end);
我希望您可以通过C API实现同样的功能

然而,这种方法存在很多问题。将限制设置得太低,它就无法完成其工作。太高了,效果也不太好。(区块可以重复运行吗?)允许代码调用一个阻塞了相当长时间的函数,而上述操作毫无意义。允许它执行任何类型的pcall,它就可以自己捕获错误。还有其他我还没想到的问题。在这里,我也完全忽略了针对任何使用调试库(除了调试)的警告

因此,如果您希望它可靠,您可能应该使用RB的解决方案。

我希望它能够很好地处理偶然的无限循环,这种循环是lua程序员非常喜欢的:p

对于内存过度使用,您可以使用一个函数以更小的间隔检查collectgarbage(“count”)的增加;你必须合并它们才能同时得到它们