Lua为什么在沙盒环境中使用'require'是不安全的?

通过此页面:http://lua-users.org/wiki/SandBoxes 将'require'标记为不安全,原因是:

  • 修改全局变量(如package.loaded)
  • 提供对沙盒外部环境的访问
  • 访问文件系统

几乎所有纯Lua库都使用'require',因此不能安全地使用'require'是一个巨大的痛点,因为您无法使用任何纯Lua库。我不明白这些不安全的原因。它在库中加载其他Lua文件。为什么那不安全?

点赞
用户1442917
用户1442917

由于有访问文件系统和全局环境的权限,沙盒中的代码可以执行代码和修改不应该修改的值。

您可以实现并提供自己的“require”方法,以满足您的沙盒要求。例如,您可以预加载已验证的库,并让“require”仅返回预加载的结果。

2016-07-26 17:59:38
用户415823
用户415823

需求在全局环境中加载和执行代码。

例如,让我们创建一个简单的沙盒(Lua >= 5.2):

-- 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)

现在,让我们创建一个改变my_global的模块:

-- example_module.lua
print('<module> my_global =', my_global)
my_global = nil

期望的是在沙盒中仅有可用的函数是requireprint。沙盒内的代码不应能够访问全局my_global

运行示例,您会看到:

$ lua example.lua
<global> my_global =    42      -- 全局环境,没问题。
<sandbox> my_global =   nil     -- 在沙盒中,没问题。
<module> my_global =    42      -- 在沙盒中加载,但使用require访问全局环境。哎呀,我们可以访问全局环境。
<global> my_global =    nil     -- 模块更改了值,反映在全局环境中。

该模块跳出了沙盒。

2016-07-26 19:15:37