0Pricing
Lua Academy · Aula

O modelo _ENV no Lua 5.2+

Compreenda como _ENV substituiu setfenv e permite controlar ambientes.

O modelo _ENV no Lua 5.2+ é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.

O que é _ENV?

No Lua 5.2+, cada trecho tem uma variável capturada implícita chamada _ENV. Todos os acessos a variáveis globais são reescritos como acessos a campos de _ENV. Assim, print(x) se torna _ENV.print(_ENV.x).

_ENV substitui setfenv

No Lua 5.1, setfenv(fn, env) alterava o ambiente global de uma função. No 5.2+, isso foi removido. Em vez disso, defina _ENV como uma variável local para alterar o ambiente de um trecho ou bloco.

Alteração de _ENV em um trecho

Defina _ENV no início de um trecho para redirecionar todos os acessos globais.

-- Everything in this chunk uses myEnv as globals
local _ENV = myEnv
print("hello")  -- calls myEnv.print("hello")

_ENV local para um bloco

Limite as alterações de _ENV a um bloco do...end para restringir seu efeito.

do
  local _ENV = {print = print, x = 42}
  print(x)  -- 42 from local _ENV
end
print(x)  -- original _ENV.x (global x)

Uso de load com _ENV

load(chunk, chunkname, mode, env) executa uma string como um trecho com um ambiente personalizado. Esse é o principal mecanismo de isolamento no 5.2+.

local env = {print = print, math = math}
local fn, err = load("print(math.sqrt(16))", "sandbox", "t", env)
if fn then fn() end  -- 4.0

Leitura do _ENV atual

O ambiente global do trecho atual é _ENV. Para obter uma referência: local myEnv = _ENV.

Modificação de _ENV em tempo de execução

A definição de uma variável global é _ENV.varName = value. Como _ENV é uma variável capturada, você pode substituí-la por outra tabela em qualquer ponto do código.

Herança com __index

Forneça ao ambiente isolado uma metatabela com __index = _G para recorrer à tabela global real para funções que você não tenha bloqueado explicitamente.

local sandboxEnv = setmetatable({}, {__index = _G})
-- then block dangerous ones:
sandboxEnv.os = nil
sandboxEnv.io = nil
sandboxEnv.load = nil

Detecção de tentativas de acesso a _ENV

Substitua as variáveis globais perigosas por um marcador que registre as tentativas de acesso para auditoria de segurança.

sandboxEnv.os = setmetatable({}, {
  __index = function(_, k)
    ngx.log(ngx.WARN, "Blocked access: os." .. k)
    return nil
  end
})

Observação sobre compatibilidade

As bibliotecas que usam setfenv/getfenv do Lua 5.1 precisam ser reescritas para o 5.2+. Algumas usam uma camada de compatibilidade no código de inicialização.

Impacto prático

O modelo _ENV torna o isolamento mais limpo e consistente. Há um mecanismo claro para os ambientes, em vez de dois (setfenv para funções e variáveis globais para o nível superior).

Pergunta sobre _ENV

Como o Lua 5.2+ reescreve o acesso global print(x)?

Recapitulação: modelo _ENV

O Lua 5.2+ faz com que todo acesso global passe pela variável capturada _ENV. Use load(code, name, "t", env) para executar código em um ambiente personalizado. Esse é o mecanismo padrão de isolamento que substitui setfenv.

Perguntas Frequentes

A aula “O modelo _ENV no Lua 5.2+” é grátis?

Sim — o texto completo de “O modelo _ENV no Lua 5.2+” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.

O que vou aprender em “O modelo _ENV no Lua 5.2+”?

Compreenda como _ENV substituiu setfenv e permite controlar ambientes. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Lua Academy?

Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “O modelo _ENV no Lua 5.2+”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Lua Academy?

Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. O modelo _ENV no Lua 5.2+
  2. Criando um sandbox restrito
  3. Evitando fugas do sandbox
  4. Limites de recursos e instrumentação
← Voltar para Lua Academy