与标准 Lua 的差异
LuaSandbox 提供了一个沙箱环境,它在某些方面与标准 Lua 5.1 不同。
不可用的功能
-
dofile()
、loadfile()
和 io
包,因为它们允许直接访问文件系统。如果需要,文件系统访问应通过 PHP 回调完成。
-
package
包,包括 require()
和 module()
,因为它严重依赖于直接文件系统访问。可以使用纯 Lua 重写(如 MediaWiki Scribunto 扩展中使用的),以替代此包。
-
load()
和 loadstring()
,以便进行 Lua 代码的静态分析。
-
print()
,因为它输出到标准输出。如果需要,输出应通过 PHP 回调完成。
-
os
包中的大部分内容,因为它允许操作进程并执行其他进程。
-
debug
包中的大部分内容,因为它允许操作 Lua 状态和元数据,而这可能会破坏沙箱。
-
string.dump()
,因为它可能会公开内部数据。
-
collectgarbage()
、gcinfo()
和 coroutine
包尚未经过安全审查。
已修改的功能
-
pcall()
和 xpcall()
无法捕获某些错误,尤其是超时错误。
-
tostring()
不包含指针地址。
-
string.match()
已被修补,以限制递归深度并定期检查超时。
-
math.random()
和 math.randomseed()
被替换为不与 PHP 的 rand()
共享状态的版本。
-
Lua 5.2 的 __pairs
和 __ipairs
元方法由 pairs()
和 ipairs()
支持。