0Pricing
Lua Academy · Pelajaran

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 },
  }
end

Menjalankan 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  2

Menangkap 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")
end

Mengembalikan 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
end

Memblokir 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)
end

Menguji 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

  1. Model _ENV dalam Lua 5.2+
  2. Membangun Sandbox Terbatas
  3. Mencegah Pelarian dari Sandbox
  4. Batas Sumber Daya dan Instrumentasi
← Kembali ke Lua Academy