0Pricing
Lua Academy · บทเรียน

การสร้างแซนด์บ็อกซ์แบบจำกัด

สร้างรายการอนุญาตของ _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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. แบบจำลอง _ENV ใน Lua 5.2+
  2. การสร้างแซนด์บ็อกซ์แบบจำกัด
  3. การป้องกันการหลบหนีจากแซนด์บ็อกซ์
  4. ขีดจำกัดทรัพยากรและการตรวจวัด
← กลับไปที่ Lua Academy