Lua为什么是';要求';在沙箱环境中使用不安全?

Lua为什么是';要求';在沙箱环境中使用不安全?,lua,Lua,通过此页面:require被标记为不安全,原因是: 修改全局变量(例如,包已加载) 提供对沙箱外部环境的访问 并访问文件系统 几乎所有的纯Lua库都使用'require',所以没有安全性是一个巨大的痛苦,因为你不能使用任何纯Lua库。我不明白这些不安全的原因。它将加载库中的其他Lua文件。为什么不安全?因为它可以访问文件系统和全局环境,所以它可以执行代码并修改不应该修改的值 您可以实现并提供自己的require方法来满足您的沙箱需求。例如,您可以预加载已验证的库,并且“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