Lua为什么是';要求';在沙箱环境中使用不安全?
通过此页面:require被标记为不安全,原因是:Lua为什么是';要求';在沙箱环境中使用不安全?,lua,Lua,通过此页面:require被标记为不安全,原因是: 修改全局变量(例如,包已加载) 提供对沙箱外部环境的访问 并访问文件系统 几乎所有的纯Lua库都使用'require',所以没有安全性是一个巨大的痛苦,因为你不能使用任何纯Lua库。我不明白这些不安全的原因。它将加载库中的其他Lua文件。为什么不安全?因为它可以访问文件系统和全局环境,所以它可以执行代码并修改不应该修改的值 您可以实现并提供自己的require方法来满足您的沙箱需求。例如,您可以预加载已验证的库,并且“require”仅返回
- 修改全局变量(例如,包已加载)
- 提供对沙箱外部环境的访问
- 并访问文件系统
几乎所有的纯Lua库都使用'require',所以没有安全性是一个巨大的痛苦,因为你不能使用任何纯Lua库。我不明白这些不安全的原因。它将加载库中的其他Lua文件。为什么不安全?因为它可以访问文件系统和全局环境,所以它可以执行代码并修改不应该修改的值
您可以实现并提供自己的
require
方法来满足您的沙箱需求。例如,您可以预加载已验证的库,并且“require”仅返回预加载的结果。require在全局环境中加载并执行代码
例如,让我们创建一个简单的沙盒(Lua>=5.2):
期望在沙箱中,可用的功能只有require
和print
。沙箱中的代码应该不能访问全局my\u global
运行该示例,您将看到:
$lua example.lua
my_global=42——全球环境,好的。
my_global=nil——在沙箱中,好的。
my_global=42——在沙箱中,但加载了require。哎呀,我们可以进入全球环境。
my_global=nil——模块更改了该值,并将其反映在全局环境中。
模块已脱离沙箱。如何允许执行修改不应执行的值的代码?你能举例说明它是如何被恶意使用的吗?我只知道需要加载其他仍受沙箱限制的lua文件,所以我想不出这是如何被错误使用的。我想
bar.lua
做一些类似package.loaded.foo={whatever}
,从而修改下一个require“foo”
调用的结果。好,因此,从最严格的意义上讲,它打破了沙箱模式的概念,但这并不是说如果个人电脑正确运行此功能,就真的可以对其进行恶意操作?假设您想限制对os
功能的访问。您将用户代码加载到一个沙箱中,希望它是安全的,然后该代码加载一个具有os.execute'rm-rf/'
的模块。好的,如果您不从C的角度限制os函数,那么require模块可以运行。据我所见,有两种限制方式。您可以提供一个新的解释器exe,其中您已经限制了从C Lua源可用的内容,或者您可以尝试限制从Lua文件本身可用的内容。如果您从C源代码进行限制,并且他们使用的解释器是您自己的exe,您已将其锁定,那么这将被视为您的沙盒模式,与仅使用默认解释器从Lua进行沙盒相比,无法解决。当然,或者,您可以实现一个require-like函数,以便在您的沙箱中公开,该沙箱将使用尊重环境的功能。
-- example.lua
my_global = 42
local sandbox
do
local _ENV = { require = require, print = print }
function sandbox()
print('<sandbox> my_global =', my_global)
require 'example_module'
end
end
print('<global> my_global =', my_global)
sandbox()
print('<global> my_global =', my_global)
-- example_module.lua
print('<module> my_global =', my_global)
my_global = nil