Model _ENV dalam Lua 5.2+
Pahami cara _ENV menggantikan setfenv dan memungkinkan pengendalian lingkungan.
Model _ENV dalam Lua 5.2+ adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.
Apa Itu _ENV?
Dalam Lua 5.2+, setiap chunk memiliki upvalue implisit bernama _ENV. Semua akses ke variabel global ditulis ulang sebagai akses bidang pada _ENV. Jadi print(x) menjadi _ENV.print(_ENV.x).
_ENV Menggantikan setfenv
Dalam Lua 5.1, setfenv(fn, env) mengubah lingkungan global suatu fungsi. Dalam 5.2+, fitur ini dihapus. Sebagai gantinya, tetapkan _ENV sebagai variabel lokal untuk mengubah lingkungan suatu chunk atau blok.
Mengubah _ENV dalam Chunk
Tetapkan _ENV di bagian atas chunk untuk mengarahkan ulang semua akses global.
-- Everything in this chunk uses myEnv as globals
local _ENV = myEnv
print("hello") -- calls myEnv.print("hello")_ENV Lokal untuk Blok
Batasi perubahan _ENV ke blok do...end agar dampaknya terbatas.
do
local _ENV = {print = print, x = 42}
print(x) -- 42 from local _ENV
end
print(x) -- original _ENV.x (global x)Menggunakan load dengan _ENV
load(chunk, chunkname, mode, env) menjalankan string sebagai chunk dengan lingkungan khusus. Ini adalah mekanisme utama sandboxing dalam 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.0Membaca _ENV Saat Ini
Variabel global chunk saat ini adalah _ENV. Untuk mendapatkan referensinya: local myEnv = _ENV.
Mengubah _ENV Saat Runtime
Menetapkan variabel global dilakukan dengan _ENV.varName = value. Karena _ENV adalah upvalue, Anda dapat menggantinya dengan tabel lain kapan saja dalam kode.
Pewarisan dengan __index
Beri lingkungan sandbox metatabel dengan __index = _G agar dapat menggunakan tabel global asli sebagai fallback untuk fungsi yang tidak Anda blokir secara eksplisit.
local sandboxEnv = setmetatable({}, {__index = _G})
-- then block dangerous ones:
sandboxEnv.os = nil
sandboxEnv.io = nil
sandboxEnv.load = nilMendeteksi Upaya Akses _ENV
Ganti variabel global berbahaya dengan sentinel yang mencatat upaya akses untuk audit keamanan.
sandboxEnv.os = setmetatable({}, {
__index = function(_, k)
ngx.log(ngx.WARN, "Blocked access: os." .. k)
return nil
end
})Catatan Kompatibilitas
Pustaka yang menggunakan setfenv/getfenv milik Lua 5.1 perlu ditulis ulang untuk 5.2+. Sebagian pustaka menggunakan shim kompatibilitas dalam kode inisialisasi.
Dampak Praktis
Model _ENV membuat sandboxing lebih bersih dan konsisten. Hanya ada satu mekanisme yang jelas untuk lingkungan, bukan dua mekanisme (setfenv untuk fungsi dan variabel global untuk tingkat teratas).
Pertanyaan tentang _ENV
Bagaimana Lua 5.2+ menulis ulang akses global print(x)?
Ringkasan: Model _ENV
Lua 5.2+ membuat semua akses global melalui upvalue _ENV. Gunakan load(code, name, "t", env) untuk menjalankan kode dalam lingkungan khusus. Ini adalah mekanisme sandboxing standar yang menggantikan setfenv.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Model _ENV dalam Lua 5.2+” gratis?
Ya — teks lengkap “Model _ENV dalam Lua 5.2+” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Model _ENV dalam Lua 5.2+”?
Pahami cara _ENV menggantikan setfenv dan memungkinkan pengendalian lingkungan. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Lua Academy?
Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Model _ENV dalam Lua 5.2+” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?
Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Model _ENV dalam Lua 5.2+
- Membangun Sandbox Terbatas
- Mencegah Pelarian dari Sandbox
- Batas Sumber Daya dan Instrumentasi