编辑:不幸的是,LuaJIT在下面的链接中被取消了比较.
这种编程语言的比较表明,LuaJIT比普通的Lua实现有十倍以上的改进.为什么变化如此之大?是否有一些特定的Lua使得它从JIT编译中受益匪浅?Python是动态类型化的,并且也被编译为字节码,那么为什么PyPy(我相信现在有JIT)显示出如此大的性能提升?
关于Lua和Javascript是否支持对象能力模型,在cap-talk邮件列表上进行了一些讨论,得出的结论是,由于支持将环境限制为被调用函数setfenv,以及对不可变对象进行不可伪造引用的可能性,OCM可能是实现.
我们看过这个怎么样了?我有兴趣从现有应用程序中删除漏洞,在Lua中使用非常有用的,慷慨的脚本支持,遗憾的是在各种情况下允许完全shell访问.需要一些shell访问:对象能力模型似乎是管理事物的好方法.但是我担心一个案例我可以说是多么令人信服,这种方法实际上可以确保在确定的混乱实践中是安全的.
一些链接:
setfenv在行动; 显示表格背后的基本思想,在适当的情况下,可以只读删除或省略Lua标准库包的最佳方法是什么?例如,删除特定环境中的os库函数.有问题的项目是从源文件构建Lua,所以我可以编辑源代码,尽管如果可能的话我宁愿通过API来完成.
可以说我至少有两个lua脚本文件.
test1.lua test2.lua
两者都定义了一个init函数和其他具有相似名称的函数.
如何使用c ++/c将每个脚本文件加载到使用Lua 5.2的单独环境中,以便相同的函数名称不会发生冲突 - 我发现5.1的示例代码对我不起作用(因为setenv已经消失而lua_setuservalue没有似乎工作)
这里的示例从.lua使用句柄调用lua函数?
基本上如果我用setuservalue替换setenv - 我得到访问冲突.
我正在尝试使用LuaInterface 2.0.3在我的C#应用程序中嵌入一些Lua脚本功能.到目前为止,这工作正常,但我无法弄清楚如何限制只访问少数指定的.Net类.默认情况下,所有.Net库都可以通过"luanet"直接访问,Lua脚本可以自由打开新窗口或访问文件系统.
例如,这个Lua脚本将打开一个新窗口:
Form = luanet.System.Windows.Forms.Form
mainForm = Form()
mainForm:ShowDialog()
Run Code Online (Sandbox Code Playgroud)
编写脚本的自由很棒,但这可能会干扰托管应用程序,并且具有一些我不太喜欢的与安全相关的含义.有没有办法禁用它?
luaL_openlibs(m_pState);
Run Code Online (Sandbox Code Playgroud)
我使用这个函数来加载所有的libs.I我想跳过像IO这样的所有危险的库,但我找不到任何关于如何禁用lib的文档.
如何禁用某些库?是否有更危险的库可以获得脚本访问系统?
我从"编程在Lua"由罗伯托·萨利姆斯学习,我发现,在本书中,沙箱的示例使用功能setfenv()改变给定函数的环境,但在Lua 5.2这一功能不再可用.
我试图将一些文件(配置文件)中的值加载到表中的字段中,但是在lua 5.2中我不能使用setfenv(所以我可以在给定的环境中加载值).在阅读了一些关于lua 5.2的文章之后,我发现每个函数可能有(或没有)一个名为_ENV的upvalue作为环境,因此,我尝试了以下代码:
function sandbox(sb_func, sb_env)
if not sb_func then return nil, "sandbox function not valid" end
sb_orig_env = _ENV
_ENV = sb_env -- yes, replaces the global _ENV
pcall_res, message = pcall( sb_func )
local modified_env = _ENV -- gets the environment that was used in the pcall( sb_func )
_ENV = sb_orig_env
return true, modified_env
end
function readFile(filename)
code = loadfile(filename)
res, table = sandbox(code, {})
if res then
--[[ Use table (modified_env) ]]-- …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用如何创建安全的Lua沙箱?建立我自己的漏洞沙箱.
我正在尝试创建一个Lua沙箱,其中一些Lua函数可以访问沙箱外的其他一些Lua函数.例如,我希望我的沙箱有一个特殊的"显示"功能,可以调用"打印"但在沙箱中也没有"打印".
主要问题是我正在尝试在已经很大的代码库中构建一个沙箱,所以我不能忽略功能.
这怎么可能?
由于没有我的过错,解决方案必须是纯粹的Lua功能.
我完成了我的作业并研究了关于这个主题的其他回复,但没有解决我的特定问题.
我想完全删除io库和os只是部分(让我们说我想保留os.clock()和其他)
我怎样才能从C API中实现这一点.
由于项目的性质,我不允许修改Lua标头和将发送给我的脚本.这些不在我的控制之下.我唯一可以修改的是解释器.
做这样的事情:
lua_pushnil(state_pointer);
lua_setglobal(state_pointer, "os.execute");
Run Code Online (Sandbox Code Playgroud)
没有多大帮助,因为在脚本中用户可以调用os = require('os')并获取所有功能
我不允许禁用require函数,因此这会使事情变得更难.
有任何想法吗?
PS:更多的好奇心:如果我做了类似的事情
luaopen_base(L);
luaopen_table(L);
luaopen_string(L);
luaopen_math(L);
luaopen_loadlib(L); (basically i'm loading every library by hand except os and io)
Run Code Online (Sandbox Code Playgroud)
代替
luaL_openlibs(L); (this loads all the libraries)
Run Code Online (Sandbox Code Playgroud)
os = require('os')或io = require('io')仍然有效吗?
@Nicol Bolas不知道我做错了什么,但os = require('os')&require('io')只是把一切都带回来了.
我的代码:
luaL_openlibs(LuaInstance); /* load the libs */
lua_pushnil(LuaInstance);
lua_setglobal(LuaInstance, "io");
lua_pushnil(LuaInstance);
lua_setglobal(LuaInstance, "os.execute");
lua_pushnil(LuaInstance);
lua_setglobal(LuaInstance, "os.rename");
lua_pushnil(LuaInstance);
lua_setglobal(LuaInstance, "os.remove");
lua_pushnil(LuaInstance);
lua_setglobal(LuaInstance, "os.exit");
Run Code Online (Sandbox Code Playgroud)
在我的脚本中,我只是做了一个
os = require('os')
io = require('io')
Run Code Online (Sandbox Code Playgroud)
在此os函数和io函数之后所有工作.os.exit仍然关闭我的应用程序,io.write像往常一样工作
我在我的C应用程序中使用Lua作为脚本语言.
它很适合我,但我无法理解如何限制Lua不要调用系统功能,包括其他模块等.
我希望Lua能够只调用我允许的函数,因为用户可以使用完整的Lua + Lua模块电源执行所有类型的错误操作.
lua ×10
sandbox ×3
security ×2
c ×1
c# ×1
c++ ×1
capability ×1
environment ×1
external ×1
file ×1
jit ×1
luainterface ×1
luajit ×1
scripting ×1