LuaL_openlibs () и скрипты песочницы - PullRequest
8 голосов
/ 29 декабря 2010

Я встраиваю Lua (5.1) в приложение C / C ++.

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

В частности, я хочу отключить модули ввода-вывода и ОС. Есть ли функция, которую я могу вызвать, чтобы программно отключить (или выгрузить) эти модули, чтобы я мог создать безопасную среду песочницы для запуска сценариев Lua?

Ответы [ 4 ]

13 голосов
/ 29 декабря 2010

luaL_openlibs просто перебирает список загрузчиков библиотеки, объявленных в том же файле.Просто удалите / закомментируйте строки luaopen_io и luaopen_os.Готово.

Если вы не хотите редактировать исходный код Lua, вы можете определить свою собственную функцию, которая исключает эти две библиотеки:

#define LUA_LIB

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

static const luaL_Reg lualibs[] = {
  {"", luaopen_base},
  {LUA_LOADLIBNAME, luaopen_package},
  {LUA_TABLIBNAME, luaopen_table},
  {LUA_STRLIBNAME, luaopen_string},
  {LUA_MATHLIBNAME, luaopen_math},
  {LUA_DBLIBNAME, luaopen_debug},
  {NULL, NULL}
};

LUALIB_API void my_openlibs (lua_State *L) {
  const luaL_Reg *lib = lualibs;
  for (; lib->func; lib++) {
    lua_pushcfunction(L, lib->func);
    lua_pushstring(L, lib->name);
    lua_call(L, 1, 0);
  }
}
9 голосов
/ 29 декабря 2010

Самое простое решение из всех: просто выполните io=nil;os=nil после загрузки библиотек.

8 голосов
/ 29 декабря 2010

Я не знаю, как отключить модули, но вы все равно можете выбрать, какие из них загружать, вместо загрузки их всех с помощью luaL_openlibs. Раздел 7.3 руководства Lua 5.1 гласит:

Функции luaopen_* (для открытия библиотек) не могут быть вызваны напрямую, как обычная функция Си. Они должны вызываться через Lua, как функция Lua.

То есть вместо прямого вызова функции, как в Lua 5.0:

luaopen_table(L);

... вы выдвигаете ее как функцию C со своим именем и используете lua_call или подобное в Lua 5.1:

lua_pushcfunction(L, luaopen_table);
lua_pushliteral(L, LUA_TABLIBNAME);
lua_call(L, 1, 0);

Функции, с которыми вы можете сделать это, перечислены в lualib.h:

Function        | Name
----------------+-----------------
luaopen_base    | ""
luaopen_table   | LUA_TABLIBNAME
luaopen_io      | LUA_IOLIBNAME
luaopen_os      | LUA_OSLIBNAME
luaopen_string  | LUA_STRLIBNAME
luaopen_math    | LUA_MATHLIBNAME
luaopen_debug   | LUA_DBLIBNAME
luaopen_package | LUA_LOADLIBNAME
0 голосов
/ 29 декабря 2010

В старых версиях Lua вы могли указать, какие библиотеки вы хотите загрузить.В частности, в моей копии lualib.h я вижу следующие объявленные функции:

LUALIB_API int (luaopen_base) (lua_State *L);
LUALIB_API int (luaopen_table) (lua_State *L);
LUALIB_API int (luaopen_io) (lua_State *L);
LUALIB_API int (luaopen_os) (lua_State *L);
LUALIB_API int (luaopen_string) (lua_State *L);
LUALIB_API int (luaopen_math) (lua_State *L);
LUALIB_API int (luaopen_debug) (lua_State *L);
LUALIB_API int (luaopen_package) (lua_State *L);
LUALIB_API void (luaL_openlibs) (lua_State *L); 

Я не могу рассказать вам о последствиях не загрузки всех библиотек, так как я вызываю luaL_openlibs () в моем коде.Первое издание по программированию на Lua доступно онлайн и упоминает, что luaL_openlibs () должна заменить вызовы функций luaopen _ * ().Тем не менее, старые функции могут быть включены для обратной совместимости.http://www.lua.org/pil/24.1.html

HTH

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...