Lua命令/语句的注意事项

我正在制作一个可扩展的游戏,考虑使用Lua作为玩家编写自己脚本的语言。

但像任何编程语言一样,Lua必定存在一些"漏洞",使得不怎么好的用户可以做坏事。

我对Lua还很陌生,所以我不知道Lua能做什么。

我在网上进行了一些调查,并发现Metatableob.exit可以用于做坏事,还有其他事情吗?

请问有没有好心人能够给我列出我应该注意的事情并将其阻止(也许通过将其替换为空字符串)的列表?

非常感谢!

点赞
用户12110258
用户12110258

Lua内置的mathstringtable库将始终安全。coroutine也是安全的,并且对某些高级Lua程序员非常有用。

Lua默认加载了一些不太安全的库(您可以轻松禁用它们):

  • os使您可以执行命令和做其他一些不好的事情。但是,os.timeos.date是有用的函数,所以请保留它们。
  • io允许您读取和编辑计算机上的任何文件。最好将其省略。
  • debug允许您“反射”程序。这意味着程序可以编辑有关自身的某些部分,可能会导致不必要的问题。可以肯定用户程序不需要这个。

而不是使用空字符串来替换某些内容,您可以始终使用setfenv(Lua 5.1),就像这样:

   local badCode = readFile("./code.lua")
   local Func = loadstring(badCode)
   setfenv(Func, {
       --如果我们在这里没有留下任何东西,那么脚本将无法访问任何全局变量。
       --它的完全沙箱。 但是让我们给它一些东西:
       print = printpcall = pcallpairs = pairsipairs = ipairserror = errorstring = stringtable = tablemath = mathcoroutine = coroutine--现在,让我们为它提供某些可能有用的函数,这些函数来自另一个具有沙箱化库的函数
       os = {
           time = os.timedate = os.dateclock = os.clock,
       },
       --所有这些都“可能”对程序有用。--现在Func已经正确沙盒化,让我们运行它!
   Func()
   --这就是您应该处理用户代码的方式。
2021-01-01 18:54:46