См. Обсуждение на вики пользователя Lua песочницы и более общую тему безопасности сценариев . Есть много тонких и не очень тонких проблем с такими вещами. Это можно сделать, но защита от кода, такого как for i=1,1e39 do end
, требует больше, чем просто ограничение того, какие функции доступны в песочнице.
Общий метод заключается в создании функциональной среды для песочницы, в которой есть белый список разрешенных функций. В некоторых случаях этот список может быть даже пустым, но, например, предоставление пользователю доступа к pairs()
почти наверняка безвредно. Страница с песочницей содержит список системных функций, разбитых по их безопасности, как удобный справочник для создания такого белого списка.
Затем вы используете lua_setfenv()
, чтобы применить функциональную среду к пользовательскому сценарию, который вы загрузили (но еще не выполнили) с помощью lua_loadfile()
или lua_loadstring()
, в зависимости от ситуации. С подключенной средой вы можете выполнить ее с lua_pcall()
и друзьями. Перед выполнением некоторые люди на самом деле сканировали загруженный байт-код на наличие операций, которые они не хотят разрешать. Это может быть использовано для полного запрета циклов или записи в глобальные переменные.
Еще одно замечание: функции загрузки обычно загружают либо предварительно скомпилированный байт-код, либо текст Lua. Оказывается, намного безопаснее, если вы никогда не разрешите предварительно скомпилированный байт-код, так как было выявлено несколько способов неправильного поведения виртуальной машины, все они зависят от ручного создания недействительного байт-кода. Поскольку файлы байт-кода начинаются с четко определенной последовательности байтов, которая не является простым текстом ASCII, все, что вам нужно сделать, это прочитать скрипт в строковый буфер, проверить отсутствие маркера и передать его только lua_loadstring()
, если не является байт-кодом.
В течение многих лет такого рода рассылок Lua-L велось немало дискуссий, так что поиск там также может быть полезным.