2011-02-23 88 views
1

我已经阅读了Lua wiki/here/etc.关于如何一般沙盒lua代码。但是我一直无法找到不允许创建函数的东西。例如,示例性here提供了示例代码为:Lua沙盒 - 消除功能创建

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

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

+4

如果这是可能的(我怀疑它):请不要做这个。更何况,你会删除语言的重要部分(不是图书馆的*语言的*) - 就好像一个嵌入式设备不支持在他们奇怪的C版本中支持指针!),这也意味着你会严重损害嵌入式Lua中写入的任何脚本的多功能性和表现力。 – delnan 2011-02-23 22:28:44

+1

如果您不允许使用功能,则不允许使用lambdas。如果你不允许使用lambda表达式,你不允许使用整个类的简单表达式。 – 2011-02-24 21:30:15

回答

6

如果你想只计算表达式,你可以试试这个:

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

(省略错误处理)

这个简单的解决方案将阻止大多数'攻击,但不能消除它们,因为人们可以说

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

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

最好的办法是使用沙箱,而不用担心用户对环境做了什么,因为它不会是你的环境中的

+0

谢谢!完美的工作......我最近买了PIL,当我看书时看到了这种方法,但忘了它。欣赏这些见解/建议。 – ktr 2011-02-25 16:14:29

1

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

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

一对夫妇的注意事项:

  • 你可能想尝试定制检测多一点 - 如果检测功能,然后空格和一个左括号,例如仅抛出错误。我将此作为练习。
  • 你应该知道,有一些标准的lua功能,希望用户能够创建功能 - 例如,string表中有几个这样的功能。如果没有创造功能,这将是非常困难的为您的用户处理字符串(它是已经与功能相当困难...)
+1

魔兽世界使用类似的方法。它有一个普通的Lua沙盒,只是防止访问程序外的任何东西。它还有第二个高度限制性的沙箱,第一个使用Lua创建,只允许访问一组预定义的功能和特性。它使用'loadstring()'来执行此操作,并检查该字符串是否首先包含“function”,“{”或“}”以防止创建函数和表。 – Arrowmaster 2011-02-24 16:47:18