我正在使用Lua嵌入式。就我而言,我想从内存文件系统中的假文件(基于.zip文件)而不是真实文件系统中加载文件。
要完成此操作,我想我需要将所有内部fopen
调用重定向/覆盖到仅在.zip文件内部显示的内容。这似乎不可能。是吗?
How can I create a secure Lua sandbox?
这是一个简单的例子:
此代码将打开一个文本文件,并将内容读入局部变量。在内部,它似乎使用fopen()
,这意味着它将仅使用真实的文件系统。
local f = io.open('filename.txt')
local t = f:read("*all")
f:close()
相反,我希望它在内部调用我的“假”文件系统,然后从假文件系统返回文件的内容。
我已经能够完成仅加载.lua文件的操作。通过添加自定义搜索器/加载器(从.zip文件加载文件)来实现这一目的。现在,require("something.lua")
仅从伪造的文件系统加载,这是完美的。
但是,load()
,dofile()
和loadfile()
仍然可以使用fopen()
。我目前正在淘汰它们,直到找到更好的解决方案为止。
load = nil
dofile = nil
loadfile = nil
在某种程度上,我认为我真的想将所有文件系统调用重定向到其他地方。
无论如何,我缩小了这个SO问题的范围,仅询问io.open
。我是否应该用自己的替换/重定向lua中的io.open
,以便从我的伪造文件系统中加载它。我想扩展一下,然后我可以重新定义io
名称空间吗?