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.0Leitura 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 = nilDetecçã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
- O modelo _ENV no Lua 5.2+
- Criando um sandbox restrito
- Evitando fugas do sandbox
- Limites de recursos e instrumentação