Я использую Lua Embedded. В моем случае я хотел бы загружать файлы из поддельной файловой системы памяти (на основе файла .zip), а не из реальной файловой системы.
Чтобы сделать это, я думаю, что мне нужно перенаправить / переопределить все внутренние fopen
вызовы на что-то, что выглядит только внутри .zip-файла. Это не представляется возможным. Это так?
Как мне создать безопасную песочницу Lua?
Вот краткий пример:
Этот код откроет текстовый файл и прочитает содержимое в локальную переменную. Внутренне он использует fopen()
, что означает, что он будет использовать только реальную файловую систему.
local f = io.open('filename.txt')
local t = f:read("*all")
f:close()
Вместо этого я хочу, чтобы это внутренне вызвало мою «поддельную» файловую систему, и я верну содержимое файла из поддельной файловой системы.
Я уже смог выполнить что-то подобное для загрузки только файлов .lua. Это сработало, добавив пользовательский поисковик / загрузчик, который загружал файлы из файла .zip. Теперь require("something.lua")
загружается только из поддельной файловой системы, что идеально.
Однако load()
, dofile()
и loadfile()
все еще работают и используют fopen()
. В настоящее время я обнуляю их, пока не найду лучшее решение.
load = nil
dofile = nil
loadfile = nil
На каком-то уровне, я думаю, я действительно хочу перенаправить все вызовы файловой системы куда-то еще.
Несмотря на это, я сузил область для этого SO вопроса, чтобы просто задать вопрос io.open
. Должен ли я заменить / перенаправить io.open
в lua на свой собственный, чтобы он загружался из моей поддельной файловой системы. Я догадываюсь по расширению, буду ли я тогда заново определять пространство имен io
?