相关疑难解决方法(0)

为什么LuaJIT这么好?

编辑:不幸的是,LuaJIT在下面的链接中被取消了比较.

这种编程语言的比较表明,LuaJIT比普通的Lua实现有十倍以上的改进.为什么变化如此之大?是否有一些特定的Lua使得它从JIT编译中受益匪浅?Python是动态类型化的,并且也被编译为字节码,那么为什么PyPy(我相信现在有JIT)显示出如此大的性能提升?

lua jit luajit

52
推荐指数
1
解决办法
2万
查看次数

Lua的能力:有什么经验?

关于Lua和Javascript是否支持对象能力模型,cap-talk邮件列表上进行了一些讨论,得出的结论是,由于支持将环境限制为被调用函数setfenv,以及对不可变对象进行不可伪造引用的可能性,OCM可能是实现.

我们看过这个怎么样了?我有兴趣从现有应用程序中删除漏洞,在Lua中使用非常有用的,慷慨的脚本支持,遗憾的是在各种情况下允许完全shell访问.需要一些shell访问:对象能力模型似乎是管理事物的好方法.但是我担心一个案例我可以说是多么令人信服,这种方法实际上可以确保在确定的混乱实践中是安全的.

一些链接:

  1. 更老的问题:如何创建安全的Lua沙箱?
  2. erights.org的背景:从对象到功能
  3. Lua wiki:SandBoxesReadOnlyTables - 显示setfenv在行动; 显示表格背后的基本思想,在适当的情况下,可以只读

security lua sandbox environment-variables capability

35
推荐指数
1
解决办法
2373
查看次数

省略Lua标准库的最佳方法是什么?

删除或省略Lua标准库包的最佳方法是什么?例如,删除特定环境中的os库函数.有问题的项目是从源文件构建Lua,所以我可以编辑源代码,尽管如果可能的话我宁愿通过API来完成.

c lua

13
推荐指数
2
解决办法
7920
查看次数

从lua.file中为5.2/Set Envirenment中的函数提供沙箱嵌入式Lua

可以说我至少有两个lua脚本文件.

test1.lua test2.lua

两者都定义了一个init函数和其他具有相似名称的函数.

如何使用c ++/c将每个脚本文件加载到使用Lua 5.2的单独环境中,以便相同的函数名称不会发生冲突 - 我发现5.1的示例代码对我不起作用(因为setenv已经消失而lua_setuservalue没有似乎工作)

这里的示例从.lua使用句柄调用lua函数?

基本上如果我用setuservalue替换setenv - 我得到访问冲突.

lua

7
推荐指数
1
解决办法
3275
查看次数

LuaInterface - 如何限制对.Net类的访问?

我正在尝试使用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)

编写脚本的自由很棒,但这可能会干扰托管应用程序,并且具有一些我不太喜欢的与安全相关的含义.有没有办法禁用它?

c# scripting lua luainterface

6
推荐指数
1
解决办法
1692
查看次数

如何以最简单的方式禁用lua中的危险函数?

可能重复:
如何限制lua的可能性(调用操作系统功能,模块等)
如何创建安全的Lua沙箱?

luaL_openlibs(m_pState);
Run Code Online (Sandbox Code Playgroud)

我使用这个函数来加载所有的libs.I我想跳过像IO这样的所有危险的库,但我找不到任何关于如何禁用lib的文档.

如何禁用某些库?是否有更危险的库可以获得脚本访问系统?

c++ security lua

6
推荐指数
1
解决办法
1643
查看次数

Lua的沙箱5.2

我从"编程在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)

environment lua file external sandbox

5
推荐指数
1
解决办法
3431
查看次数

Lua Sandbox具有泄漏的特殊功能

我正在尝试使用如何创建安全的Lua沙箱?建立我自己的漏洞沙箱.

我正在尝试创建一个Lua沙箱,其中一些Lua函数可以访问沙箱外的其他一些Lua函数.例如,我希望我的沙箱有一个特殊的"显示"功能,可以调用"打印"但在沙箱中也没有"打印".

主要问题是我正在尝试在已经很大的代码库中构建一个沙箱,所以我不能忽略功能.

这怎么可能?

由于没有我的过错,解决方案必须是纯粹的Lua功能.

lua sandbox

4
推荐指数
1
解决办法
1278
查看次数

如何在不编辑Lua头文件或脚本的情况下从os库中删除特定函数

我完成了我的作业并研究了关于这个主题的其他回复,但没有解决我的特定问题.

我想完全删除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像往常一样工作

lua

3
推荐指数
1
解决办法
3214
查看次数

如何限制lua的可能性(调用OS功能,模块等)

我在我的C应用程序中使用Lua作为脚本语言.

它很适合我,但我无法理解如何限制Lua不要调用系统功能,包括其他模块等.

我希望Lua能够只调用我允许的函数,因为用户可以使用完整的Lua + Lua模块电源执行所有类型的错误操作.

lua

2
推荐指数
1
解决办法
1422
查看次数