Lua Sandboxing - 消除功能创建

时间:2011-02-23 22:25:33

标签: lua sandbox

我已经阅读了Lua wiki / here /等关于如何沙箱lua代码的一般信息。但我无法找到不允许创建函数的东西。例如,示例here提供了一个示例代码:

assert(run [[function f(x) return x^2 end; t={2}; t[1]=f(t[1])]])

这是一个空洞的环境。但是我想要消除创建函数的能力(代码的第一部分) - 例如,只允许表达式。有关如何做到这一点的任何想法?是否必须以某种方式在C?提前谢谢!

2 个答案:

答案 0 :(得分:6)

如果您只想评估表达式,可以试试这个:

function run(s) return loadstring("return "..s)() end

(省略错误处理)

这个简单的解决方案可以防止大多数“攻击”,但不会消除它们,因为可以说

(function () f=function(x) print"hello" end end)()

定义了一个名为f的新函数。

您最好的选择是使用沙箱而不用担心用户对环境的影响,因为它不会您的环境。

答案 1 :(得分:1)

您可以尝试通过在允许执行lua脚本之前查找字符串“function”来检测函数的创建。例如,从您的C / C ++后端。

如果出现“function”,则抛出“不允许创建函数”错误,不执行代码。

一对夫妇注意到:

  • 您可能希望尝试更多地自定义检测 - 例如,如果检测到函数后跟空格和左括号,则仅抛出错误。我将其作为一项练习。
  • 您应该知道有一些标准的lua函数可以期望用户能够创建函数 - 例如,string表有几个。如果不创建函数,那么您的用户将很难使用字符串(已经使用函数已经足够困难了......)