Что LHF сказал.
Для дополнительной устойчивости файлов, которые могут быть не из полностью доверенного источника, вы должны прочитать о песочнице в вики.
Ключевая идея - быть осторожным с тем, какие глобальные функции и переменные доступны для кода, выполняемого в контексте вашего файла данных. Простой способ получить много контроля над этим - создать таблицу окружения, которая предоставляет глобальные переменные скрипту, чтобы он содержал только белый список безопасных функций. Вы делаете это, создавая подходящую таблицу, а затем устанавливая ее как среду только что скомпилированного скрипта, прежде чем вызывать ее. lua_setfenv()
из C API или setfenv
со стороны Lua могут оба использоваться на объекте, возвращенном при успешном вызове luaL_loadfile()
, loadfile
или один из их родственников в C API или из Lua, соответственно. Как только скрипт загружен и назначена среда, вы запускаете его с lua_pcall()
или pcall
.
Не забудьте проверить все на наличие ошибок.
Когда сценарий завершается, созданные им переменные записываются или обновляются в его таблице окружения, а не _G
.
Естественно, эта таблица окружения может использовать метатаблицу, чтобы сделать некоторые глобальные переменные, которые вы предоставляете скрипту, доступными только для чтения.
Для дополнительного контроля некоторые пошли дальше и договорились ограничить количество виртуальных циклов команд или реальное время, отводимое сценарием. Можно даже проверить байт-код после загрузки на наличие определенных кодов операций. Это может быть использовано для предотвращения даже попытки выполнения сценария, который содержит цикл во многих случаях.