Il modello _ENV in Lua 5.2+
Comprenda come _ENV abbia sostituito setfenv e consenta di controllare l'ambiente.
Il modello _ENV in Lua 5.2+ è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.
Che cos'è _ENV?
A partire da Lua 5.2, ogni chunk ha un upvalue implicito chiamato _ENV. Tutti gli accessi alle variabili globali vengono riscritti come accessi a campi di _ENV. Di conseguenza, print(x) diventa _ENV.print(_ENV.x).
_ENV sostituisce setfenv
In Lua 5.1, setfenv(fn, env) modificava l'ambiente globale di una funzione. Dalla versione 5.2 in poi non è più disponibile. Al suo posto, imposti _ENV come variabile locale per modificare l'ambiente di un chunk o di un blocco.
Modifica di _ENV in un chunk
Imposti _ENV all'inizio di un chunk per reindirizzare tutti gli accessi globali.
-- Everything in this chunk uses myEnv as globals
local _ENV = myEnv
print("hello") -- calls myEnv.print("hello")_ENV locale per un blocco
Limiti l'ambito delle modifiche a _ENV a un blocco do...end per limitarne l'effetto.
do
local _ENV = {print = print, x = 42}
print(x) -- 42 from local _ENV
end
print(x) -- original _ENV.x (global x)Uso di load con _ENV
load(chunk, chunkname, mode, env) esegue una stringa come chunk con un ambiente personalizzato. Questo è il principale meccanismo di sandboxing nella versione 5.2 e successive.
local env = {print = print, math = math}
local fn, err = load("print(math.sqrt(16))", "sandbox", "t", env)
if fn then fn() end -- 4.0Lettura di _ENV corrente
Le variabili globali del chunk corrente sono contenute in _ENV. Per ottenere un riferimento: local myEnv = _ENV.
Modifica di _ENV a runtime
Impostare una variabile globale significa usare _ENV.varName = value. Poiché _ENV è un upvalue, può sostituirlo con una tabella diversa in qualsiasi punto del codice.
Ereditarietà con __index
Assegni all'ambiente della sandbox una metatabella con __index = _G per usare la tabella globale reale come fallback per le funzioni che non ha bloccato esplicitamente.
local sandboxEnv = setmetatable({}, {__index = _G})
-- then block dangerous ones:
sandboxEnv.os = nil
sandboxEnv.io = nil
sandboxEnv.load = nilRilevamento dei tentativi di accesso a _ENV
Sostituisca le variabili globali pericolose con un valore sentinella che registri i tentativi di accesso per l'audit di sicurezza.
sandboxEnv.os = setmetatable({}, {
__index = function(_, k)
ngx.log(ngx.WARN, "Blocked access: os." .. k)
return nil
end
})Nota sulla compatibilità
Le librerie che utilizzano setfenv/getfenv di Lua 5.1 devono essere riscritte per la versione 5.2 e successive. Alcune utilizzano un compatibility shim nel codice di init.
Impatto pratico
Il modello _ENV rende il sandboxing più chiaro e coerente. Fornisce un unico meccanismo esplicito per gli ambienti invece di due (setfenv per le funzioni e le variabili globali per il livello superiore).
Domanda su _ENV
In che modo Lua 5.2 e successive riscrive l'accesso globale print(x)?
Riepilogo: modello _ENV
Lua 5.2 e successive fanno passare tutti gli accessi globali attraverso l'upvalue _ENV. Utilizzi load(code, name, "t", env) per eseguire il codice in un ambiente personalizzato. Questo è il meccanismo standard di sandboxing che sostituisce setfenv.
Domande Frequenti
La lezione «Il modello _ENV in Lua 5.2+» è gratuita?
Sì — il testo completo di «Il modello _ENV in Lua 5.2+» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.
Cosa imparerò in «Il modello _ENV in Lua 5.2+»?
Comprenda come _ENV abbia sostituito setfenv e consenta di controllare l'ambiente. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Lua Academy?
Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.
Quanto tempo richiede la lezione «Il modello _ENV in Lua 5.2+»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Lua Academy?
Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Il modello _ENV in Lua 5.2+
- Creazione di una sandbox limitata
- Prevenzione delle evasioni dalla sandbox
- Limiti delle risorse e strumentazione