LuaL_openlibs()和沙盒脚本

我在一个C / C ++应用程序中嵌入了Lua(5.1)。

我正在使用LuaL_openlibs()函数来加载基础库。 但是,此函数会加载一些我想要禁用的其他库,以便它们不能用于我的Lua脚本。

具体来说,我想禁用IO和OS模块。 是否有一个函数我可以调用程序性地禁用(或卸载)这些模块,以便我可以创建一个安全的沙箱环境来运行Lua脚本?

我不知道如何禁用模块,但您仍然可以选择加载哪些模块而不是使用luaL_openlibs加载它们。 Lua 5.1手册的7.3节说:

luaopen_*函数(用于打开库)不能像常规C函数那样直接调用。 它们必须通过Lua调用,就像Lua函数一样。

也就是说,而不是直接调用Lua 5.0中的函数:

 luaopen_table(L); 

…你把它作为一个C函数用它的名字推送,并在Lua 5.1中使用lua_call或类似的东西:

 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 

luaL_openlibs只是遍历一个在同一个文件中声明的库加载器列表。 只需删除/注释掉luaopen_ioluaopen_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); } } 

最简单的解决方案:加载库后,只需要io=nil;os=nil

在旧版本的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 _ *()函数调用。 但是,为了向后兼容,可能仍会包含旧function。 http://www.lua.org/pil/24.1.html

HTH