我已经阅读了Lua wiki / here /等关于如何沙箱lua代码的一般信息。但我无法找到不允许创建函数的东西。例如,示例here提供了一个示例代码:
assert(run [[function f(x) return x^2 end; t={2}; t[1]=f(t[1])]])
这是一个空洞的环境。但是我想要消除创建函数的能力(代码的第一部分) - 例如,只允许表达式。有关如何做到这一点的任何想法?是否必须以某种方式在C?提前谢谢!
答案 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”,则抛出“不允许创建函数”错误,不执行代码。
一对夫妇注意到:
string
表有几个。如果不创建函数,那么您的用户将很难使用字符串(已经使用函数已经足够困难了......)