Я делаю игру с возможностью модификации и думаю об использовании Lua в качестве языка, на котором игроки смогут писать свои собственные сценарии.

Но, как и любой язык программирования, Lua обязательно имеет некоторые "лазейки" для не очень хороших пользователей, чтобы делать плохие вещи.

Я новичок в Lua, поэтому не знаю, что Lua "умеет" делать.

Я провел небольшое исследование в Интернете и обнаружил, что Metatable и ob.exit могут быть использованы для плохих вещей, есть ли еще какие-нибудь другие вещи?

Может быть, кто-нибудь будет так добр и даст мне список вещей, которые я должен остерегаться и блокировать (возможно, заменяя их пустой строкой)?

Мы очень признательны!

PiggyChu001

Ответов: 1

Ответы (1)

Встроенные в Lua библиотеки math, string и table будут всегда безопасны. coroutine также безопасна и чрезвычайно полезна для некоторых продвинутых программистов lua.

Есть и другие, не очень безопасные библиотеки, которые lua загружает по умолчанию (которые вы можете легко отключить)

  • os позволяет выполнять команды и делать другие неприятные вещи. Однако os.time и os.date являются полезными функциями, так что сохраните их.
  • .
  • io позволяет читать и редактировать любые файлы на компьютере. Вероятно, ее лучше не включать.
  • debug позволяет вам "отражать" программу. Это означает, что программа может редактировать некоторые детали о себе, и это может быть нежелательно. Можно с уверенностью сказать, что пользовательским программам это не понадобится. Никогда.

И вместо того, чтобы заменять что-то пустой строкой, вы всегда можете заменить ее с помощью setfenv (Lua 5.1), например, так:

 local badCode = readFile("./code.lua")
   local Func = loadstring(badCode)
   setfenv(Func, {
       -- Если мы ничего здесь не оставим, то скрипт не сможет получить доступ ни к одной глобальной переменной.
       -- Это идеальная "песочница". Но давайте дадим ему некоторые вещи:
       print = print, pcall = pcall, pairs = pairs, ipairs = ipairs, error = error, string = string, table = table, math = math, coroutine = coroutine,
       -- Теперь давайте дадим ему несколько функций, которые *могут* быть полезны, из библиотеки, которая в остальном находится в песочнице
       os = {
           время = os.time,
           дата = os.date,
           часы = os.clock,
       },
       -- Все это "как бы" полезно для программы.

   })
   -- Теперь, когда Func должным образом изолирован, давайте запустим его!
   Func()
   -- Вот как вы должны обращаться с пользовательским кодом.

2022 WebDevInsider