Membina Kotak Pasir Terhad
Cipta senarai putih _ENV yang selamat dan laksanakan kod tidak dipercayai dengan load().
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 },
}
endMenjalankan 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 2Menangkap 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")
endMengembalikan 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
endMenyekat 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)
endMenguji 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.
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
- Model _ENV dalam Lua 5.2+
- Membina Kotak Pasir Terhad
- Mencegah Pelarian Kotak Pasir
- Had Sumber dan Instrumentasi