Lua Academy · Lektion

_ENV-modellen i Lua 5.2+

Forstå, hvordan _ENV erstattede setfenv og muliggør styring af miljøet.

Lektion 1 af 413 trin

_ENV-modellen i Lua 5.2+ er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.

Hvad er _ENV?

I Lua 5.2+ har hver kodeblok en implicit upvalue kaldet _ENV. Alle opslag af globale variabler omskrives til feltopslag på _ENV. Derfor bliver print(x) til _ENV.print(_ENV.x).

_ENV erstatter setfenv

I Lua 5.1 ændrede setfenv(fn, env) en funktions globale miljø. I 5.2+ er dette fjernet. Angiv i stedet _ENV som lokal variabel for at ændre miljøet for en kodeblok eller blok.

Ændring af _ENV i en kodeblok

Angiv _ENV øverst i en kodeblok for at omdirigere alle globale opslag.

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

Lokal _ENV for en blok

Begræns ændringen af _ENV til en do...end-blok for at begrænse virkningen.

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

Brug af load med _ENV

load(chunk, chunkname, mode, env) udfører en streng som en kodeblok med et brugerdefineret miljø. Dette er den primære mekanisme til sandkasseisolering i 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

Læsning af den aktuelle _ENV

Den aktuelle kodebloks globale værdier findes i _ENV. Hent en reference med: local myEnv = _ENV.

Ændring af _ENV under kørsel

Angivelse af en global variabel er _ENV.varName = value. Da _ENV er en upvalue, kan du udskifte den med en anden tabel når som helst i koden.

Nedarvning med __index

Giv sandkassemiljøet en metatabel med __index = _G for at falde tilbage til den rigtige globale tabel for funktioner, du ikke udtrykkeligt har blokeret.

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

Registrering af forsøg på adgang til _ENV

Erstat farlige globale variabler med en markørværdi, der logfører adgangsforsøg til sikkerhedsrevision.

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

Kompatibilitetsbemærkning

Biblioteker, der bruger Lua 5.1's setfenv/getfenv, skal omskrives til 5.2+. Nogle bruger et kompatibilitetslag i initialiseringskoden.

Praktisk betydning

_ENV-modellen gør sandkasseisolering renere og mere ensartet. Der er én klar mekanisme til miljøer i stedet for to (setfenv for funktioner kontra globale variabler på øverste niveau).

Spørgsmål om _ENV

Hvordan omskriver Lua 5.2+ det globale opslag print(x)?

Opsummering: _ENV-modellen

Lua 5.2+ lader al global adgang gå gennem upvalue'en _ENV. Brug load(code, name, "t", env) til at udføre kode i et brugerdefineret miljø. Dette er standardmekanismen til sandkasseisolering, som erstatter setfenv.

Gratis at komme i gang

Lær Lua med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
40
Lektioner
159

Ofte stillede spørgsmål

Er lektionen “_ENV-modellen i Lua 5.2+” gratis?

Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “_ENV-modellen i Lua 5.2+”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “_ENV-modellen i Lua 5.2+”?

Forstå, hvordan _ENV erstattede setfenv og muliggør styring af miljøet. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Lua Academy?

Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “_ENV-modellen i Lua 5.2+”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Lua Academy-lektion?

Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. _ENV-modellen i Lua 5.2+
  2. Opbygning af en begrænset sandbox
  3. Forebyggelse af sandbox-omgåelser
  4. Ressourcegrænser og instrumentering
← Tilbage til Lua Academy