Membangun Sandbox Terbatas
Buat daftar putih _ENV yang aman dan jalankan kode tak tepercaya dengan load().
Membangun Sandbox Terbatas adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.
Tujuan
Sandbox terbatas memungkinkan Anda menjalankan kode Lua yang tidak tepercaya dengan aman: kode tersebut dapat melakukan perhitungan serta menggunakan string dan matematika, tetapi tidak dapat mengakses sistem berkas, OS, atau jaringan.
Pendekatan Daftar Izin
Bangun lingkungan sandbox dari awal dengan hanya menyertakan fungsi yang aman dan telah dipahami dengan baik.
local function makeSandbox()
return {
print = print,
type = type,
tostring = tostring,
tonumber = tonumber,
pairs = pairs,
ipairs = ipairs,
next = next,
select = select,
unpack = table.unpack,
error = error,
pcall = pcall,
xpcall = xpcall,
math = math,
string = { format=string.format, find=string.find,
match=string.match, gmatch=string.gmatch,
gsub=string.gsub, sub=string.sub,
len=string.len, byte=string.byte, char=string.char },
table = { insert=table.insert, remove=table.remove,
concat=table.concat, sort=table.sort,
unpack=table.unpack, move=table.move },
}
endMenjalankan Kode dalam Sandbox
Muat dan jalankan kode pengguna dengan sandbox sebagai _ENV-nya.
local function runSandboxed(code, env)
local fn, err = load(code, "user", "t", env)
if not fn then return nil, err end
return pcall(fn)
end
local env = makeSandbox()
local ok, err = runSandboxed("return 1+1", env)
print(ok, err) -- true 2Menangkap Keluaran
Ganti print dengan fungsi khusus yang menambahkan keluaran ke buffer, bukan menulisnya ke stdout.
local output = {}
env.print = function(...)
local parts = {}
for i = 1, select("#", ...) do
parts[i] = tostring(select(i, ...))
end
output[#output+1] = table.concat(parts, "\t")
endMengembalikan Nilai
Untuk mengizinkan kode dalam sandbox mengembalikan nilai, panggil chunk yang telah dikompilasi sebagai fungsi dan tangkap nilai yang dikembalikannya.
local fn = load("return math.sqrt(144)", "user", "t", env)
if fn then
local ok, result = pcall(fn)
print(ok, result) -- true 12.0
endMemblokir Eksploitasi Metode Meta
Kode dalam sandbox tidak boleh mendapatkan referensi ke metatabel atau rawget/rawset agar tidak dapat melewati pembatasan bidang.
Membatasi Panjang String
Timpa operasi string untuk membatasi panjang keluaran dan mencegah serangan penolakan layanan melalui alokasi string berukuran sangat besar.
Batas Sumber Daya dengan debug.sethook
Tambahkan kait penghitung instruksi untuk menghentikan kode yang berjalan tanpa henti.
local function sandboxWithLimit(code, env, maxOps)
local ops = 0
debug.sethook(function()
ops = ops + 1
if ops > maxOps then error("Instruction limit exceeded") end
end, "", 100)
local result = table.pack(runSandboxed(code, env))
debug.sethook()
return table.unpack(result, 1, result.n)
endMenguji Sandbox
Tulis tes yang mencoba vektor pelolosan yang telah diketahui: mengakses _G, memanggil load, menggunakan debug, lalu pastikan semuanya gagal.
Vektor Pelolosan yang Diketahui
Rute pelolosan yang umum: string.rep("x",2^30) (serangan penolakan layanan terhadap memori), ({}).__index pada objek standar, debug melalui metatabel string, dan io melalui package.loaded.
Pertanyaan tentang Sandbox
Mengapa sandbox tidak menyertakan load atau dofile?
Ringkasan: Membangun Sandbox Terbatas
Masukkan hanya fungsi yang aman ke dalam tabel env khusus menggunakan daftar izin. Gunakan load(code, name, "t", env). Tambahkan penghitungan instruksi dengan debug.sethook. Uji vektor pelolosan. Jangan pernah menyertakan load, dofile, debug, atau akses ke tabel global.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Membangun Sandbox Terbatas” gratis?
Ya — teks lengkap “Membangun Sandbox Terbatas” 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 “Membangun Sandbox Terbatas”?
Buat daftar putih _ENV yang aman dan jalankan kode tak tepercaya dengan load(). 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 2 dari 4.
Berapa lama pelajaran “Membangun Sandbox Terbatas” 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