Lua Academy · Pelajaran

Membina Kotak Pasir Terhad

Cipta senarai putih _ENV yang selamat dan laksanakan kod tidak dipercayai dengan load().

Pelajaran 2 daripada 412 langkah

Membina Kotak Pasir Terhad ialah pelajaran Lua Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Lua Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.

Matlamat

Kotak pasir terhad membolehkan anda menjalankan kod Lua yang tidak dipercayai dengan selamat: kod itu boleh melakukan pengiraan serta menggunakan rentetan dan matematik, tetapi tidak boleh mengakses sistem fail, OS atau rangkaian.

Pendekatan Senarai Benarkan

Bina persekitaran kotak pasir dari awal dengan hanya menyertakan fungsi yang selamat dan difahami 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 Kod dalam Kotak Pasir

Muatkan dan laksanakan kod pengguna dengan kotak pasir 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

Gantikan print dengan fungsi tersuai yang menambahkan data pada penimbal dan bukannya menulis kepada keluaran piawai.

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 membenarkan kod dalam kotak pasir mengembalikan nilai, panggil unit kod terkompil 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

Menyekat Eksploitasi Kaedah Meta

Kod dalam kotak pasir tidak sepatutnya menerima rujukan kepada metatabel atau rawget/rawset bagi mengelakkan pintasan terhadap sekatan medan.

Mengehadkan Panjang Rentetan

Gantikan operasi rentetan untuk mengehadkan panjang keluaran dan mencegah DoS melalui peruntukan rentetan yang sangat besar.

Had Sumber dengan debug.sethook

Tambahkan cangkuk pembilang arahan untuk menamatkan kod 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 Kotak Pasir

Tulis ujian yang mencuba laluan pelarian yang diketahui: mengakses _G, memanggil load, menggunakan debug, dan sahkan semuanya gagal.

Laluan Pelarian yang Diketahui

Laluan pelarian biasa: string.rep("x",2^30) (DoS memori), ({}).__index pada objek piawai, debug melalui metatabel rentetan, io melalui package.loaded.

Soalan Kotak Pasir

Mengapakah kotak pasir tidak menyertakan load atau dofile?

Imbas Kembali: Membina Kotak Pasir Terhad

Benarkan hanya fungsi yang selamat dalam jadual persekitaran tersuai. Gunakan load(code, name, "t", env). Tambahkan pengiraan arahan dengan debug.sethook. Uji laluan pelarian. Jangan sekali-kali sertakan load, dofile, debug atau capaian kepada jadual global.

Percuma untuk bermula

Pelajari Lua dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
40
Pelajaran
159

Soalan Lazim

Adakah pelajaran “Membina Kotak Pasir Terhad” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Lua Academy, termasuk “Membina Kotak Pasir Terhad”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Lua Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Membina Kotak Pasir Terhad”?

Cipta senarai putih _ENV yang selamat dan laksanakan kod tidak dipercayai dengan load(). Anda berlatih Lua Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Lua Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Lua Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Membina Kotak Pasir Terhad” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Lua Academy ini?

Ya. Setiap pelajaran Lua Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Model _ENV dalam Lua 5.2+
  2. Membina Kotak Pasir Terhad
  3. Mencegah Pelarian Kotak Pasir
  4. Had Sumber dan Instrumentasi
← Kembali ke Lua Academy