0Pricing
Lua Academy · Lekcja

Model _ENV w Lua 5.2+

Proszę zrozumieć, jak _ENV zastąpiło setfenv i umożliwia kontrolowanie środowiska.

Model _ENV w Lua 5.2+ to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.

Czym jest _ENV?

W Lua 5.2+ każdy fragment kodu ma niejawną zmienną upvalue o nazwie _ENV. Wszystkie odwołania do zmiennych globalnych są przepisywane na odwołania do pól tabeli _ENV. Zatem print(x) staje się _ENV.print(_ENV.x).

_ENV zastępuje setfenv

W Lua 5.1 funkcja setfenv(fn, env) zmieniała środowisko globalne funkcji. W wersji 5.2+ została usunięta. Zamiast tego należy ustawić _ENV jako zmienną lokalną, aby zmienić środowisko fragmentu kodu lub bloku.

Zmiana _ENV we fragmencie kodu

Ustawienie _ENV na początku fragmentu kodu przekierowuje wszystkie odwołania do zmiennych globalnych.

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

Lokalny _ENV dla bloku

Zmianę _ENV należy ograniczyć do bloku do...end, aby ograniczyć jej wpływ.

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

Używanie load z _ENV

load(chunk, chunkname, mode, env) wykonuje ciąg znaków jako fragment kodu w niestandardowym środowisku. Jest to podstawowy mechanizm piaskownicy w wersji 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

Odczytywanie bieżącego _ENV

Zmienne globalne bieżącego fragmentu kodu znajdują się w _ENV. Aby uzyskać odwołanie, należy użyć: local myEnv = _ENV.

Modyfikowanie _ENV w czasie działania

Ustawienie zmiennej globalnej ma postać _ENV.varName = value. Ponieważ _ENV jest zmienną upvalue, można w dowolnym momencie wykonania kodu zamienić ją na inną tabelę.

Dziedziczenie za pomocą __index

Środowisku piaskownicy należy nadać metatabelę z wartością __index = _G, aby funkcje, których jawnie nie zablokowano, korzystały z prawdziwej tabeli globalnej.

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

Wykrywanie prób dostępu do _ENV

Niebezpieczne zmienne globalne należy zastąpić wartością sygnalizacyjną, która rejestruje próby dostępu na potrzeby audytu bezpieczeństwa.

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

Uwaga dotycząca zgodności

Biblioteki korzystające z setfenv/getfenv z Lua 5.1 wymagają przepisania na potrzeby wersji 5.2+. Niektóre używają warstwy zgodności w kodzie inicjalizacyjnym.

Znaczenie praktyczne

Model _ENV sprawia, że tworzenie piaskownicy jest prostsze i bardziej spójne. Zamiast dwóch mechanizmów — setfenv dla funkcji i zmiennych globalnych dla kodu najwyższego poziomu — istnieje jeden jasno określony mechanizm obsługi środowisk.

Pytanie dotyczące _ENV

W jaki sposób Lua 5.2+ przepisuje odwołanie do zmiennej globalnej print(x)?

Podsumowanie: model _ENV

Lua 5.2+ kieruje wszystkie odwołania do zmiennych globalnych przez zmienną upvalue _ENV. Za pomocą load(code, name, "t", env) można wykonywać kod w niestandardowym środowisku. Jest to standardowy mechanizm tworzenia piaskownicy, który zastępuje setfenv.

Często zadawane pytania

Czy lekcja „Model _ENV w Lua 5.2+” jest bezpłatna?

Tak — pełny tekst „Model _ENV w Lua 5.2+” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Model _ENV w Lua 5.2+”?

Proszę zrozumieć, jak _ENV zastąpiło setfenv i umożliwia kontrolowanie środowiska. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Lua Academy?

Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Model _ENV w Lua 5.2+”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?

Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Model _ENV w Lua 5.2+
  2. Tworzenie ograniczonego sandboxa
  3. Zapobieganie ucieczkom z sandboxa
  4. Limity zasobów i instrumentacja
← Powrót do Lua Academy