การสร้างแซนด์บ็อกซ์แบบจำกัด
สร้างรายการอนุญาตของ _ENV ที่ปลอดภัยและเรียกใช้โค้ดที่ไม่น่าเชื่อถือด้วย load()
การสร้างแซนด์บ็อกซ์แบบจำกัด เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
เป้าหมาย
แซนด์บ็อกซ์แบบจำกัดช่วยให้เรียกใช้โค้ด Lua ที่ไม่น่าเชื่อถือได้อย่างปลอดภัย โค้ดสามารถคำนวณและใช้สตริงกับคณิตศาสตร์ได้ แต่ไม่สามารถเข้าถึงระบบไฟล์ OS หรือเครือข่าย
แนวทางรายการอนุญาต
สร้างสภาพแวดล้อมของแซนด์บ็อกซ์ขึ้นใหม่ตั้งแต่ต้น โดยใส่เฉพาะฟังก์ชันที่ปลอดภัยและเข้าใจการทำงานเป็นอย่างดี
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การเรียกใช้โค้ดในแซนด์บ็อกซ์
โหลดและเรียกใช้โค้ดของผู้ใช้โดยกำหนดให้แซนด์บ็อกซ์เป็น _ENV
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การดักจับเอาต์พุต
แทนที่ print ด้วยฟังก์ชันแบบกำหนดเองที่เพิ่มข้อมูลลงในบัฟเฟอร์แทนการเขียนไปยังเอาต์พุตมาตรฐาน
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การส่งคืนค่า
หากต้องการให้โค้ดในแซนด์บ็อกซ์ส่งคืนค่า ให้เรียกชังก์ที่คอมไพล์แล้วเป็นฟังก์ชัน และดักจับค่าที่ส่งคืน
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การบล็อกการโจมตีผ่านเมทาเมธอด
โค้ดในแซนด์บ็อกซ์ไม่ควรได้รับการอ้างอิงถึงเมทาเทเบิลหรือ rawget/rawset เพื่อป้องกันการข้ามข้อจำกัดของฟิลด์
การจำกัดความยาวสตริง
แทนที่การดำเนินการกับสตริงเพื่อจำกัดความยาวเอาต์พุตและป้องกันการโจมตีแบบปฏิเสธการให้บริการผ่านการจัดสรรสตริงขนาดใหญ่
การจำกัดทรัพยากรด้วย debug.sethook
เพิ่มฮุกนับคำสั่งเพื่อยุติโค้ดที่ทำงานไม่สิ้นสุด
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การทดสอบแซนด์บ็อกซ์
เขียนการทดสอบที่พยายามใช้ช่องทางหลบหนีที่ทราบ เช่น การเข้าถึง _G การเรียก load และการใช้ debug จากนั้นตรวจสอบว่าทั้งหมดล้มเหลว
ช่องทางหลบหนีที่ทราบ
เส้นทางหลบหนีทั่วไป ได้แก่ string.rep("x",2^30) ซึ่งทำให้เกิดการโจมตีหน่วยความจำ การใช้ ({}).__index กับออบเจ็กต์มาตรฐาน การเข้าถึง debug ผ่านเมทาเทเบิลของสตริง และการเข้าถึง io ผ่าน package.loaded
คำถามเกี่ยวกับแซนด์บ็อกซ์
เหตุใดแซนด์บ็อกซ์จึงไม่รวม load หรือ dofile
ทบทวน: การสร้างแซนด์บ็อกซ์แบบจำกัด
ใส่เฉพาะฟังก์ชันที่ปลอดภัยไว้ในตาราง env แบบกำหนดเอง ใช้ load(code, name, "t", env) เพิ่มการนับคำสั่งด้วย debug.sethook ทดสอบช่องทางหลบหนี และอย่าใส่ load, dofile, debug หรือการเข้าถึงตารางส่วนกลาง
คำถามที่พบบ่อย
บทเรียน “การสร้างแซนด์บ็อกซ์แบบจำกัด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การสร้างแซนด์บ็อกซ์แบบจำกัด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การสร้างแซนด์บ็อกซ์แบบจำกัด”
สร้างรายการอนุญาตของ _ENV ที่ปลอดภัยและเรียกใช้โค้ดที่ไม่น่าเชื่อถือด้วย load() คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การสร้างแซนด์บ็อกซ์แบบจำกัด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- แบบจำลอง _ENV ใน Lua 5.2+
- การสร้างแซนด์บ็อกซ์แบบจำกัด
- การป้องกันการหลบหนีจากแซนด์บ็อกซ์
- ขีดจำกัดทรัพยากรและการตรวจวัด