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

การแซนด์บ็อกซ์การทำงานของปลั๊กอิน

เรียกใช้ปลั๊กอินในสภาพแวดล้อมจำกัดด้วย setfenv/load และ _ENV แบบกำหนดเอง

การแซนด์บ็อกซ์การทำงานของปลั๊กอิน เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

เหตุใดจึงใช้แซนด์บ็อกซ์กับปลั๊กอิน

โค้ดปลั๊กอินที่ไม่น่าเชื่อถืออาจเรียกใช้ฟังก์ชันอันตราย (os.execute, io.open, load) หรือเข้าถึงสถานะส่วนตัวของแอปพลิเคชัน แซนด์บ็อกซ์จะจำกัดสิ่งที่โค้ดทำได้

_ENV แบบกำหนดเองในลัว 5.2 ขึ้นไป

ในลัว 5.2 ขึ้นไป สภาพแวดล้อมส่วนกลางของชุดคำสั่งแต่ละชุดคือ _ENV โหลดชุดคำสั่งด้วย _ENV ที่จำกัดสิทธิ์เพื่อจำกัดการเข้าถึง

local function sandbox(code, env)
  local chunk, err = load(code, "sandbox", "t", env)
  if not chunk then return nil, err end
  return pcall(chunk)
end

การสร้างสภาพแวดล้อมที่ปลอดภัย

สร้างสภาพแวดล้อมแบบบัญชีอนุญาตที่มีเฉพาะฟังก์ชันจากไลบรารีมาตรฐานที่ปลอดภัย

local safeEnv = {
  print  = print,
  type   = type,
  pairs  = pairs,
  ipairs = ipairs,
  tostring = tostring,
  tonumber = tonumber,
  table  = {insert=table.insert, concat=table.concat, sort=table.sort},
  string = {format=string.format, find=string.find, match=string.match},
  math   = math,
}

การบล็อกฟังก์ชันอันตราย

ตัดสิ่งต่อไปนี้ออกอย่างชัดเจน: os, io, load, loadfile, dofile, require, debug ห้ามคัดลอกสิ่งเหล่านี้ไปไว้ใน safeEnv

การโหลดไฟล์ในแซนด์บ็อกซ์

โหลดไฟล์ปลั๊กอินและเรียกใช้งานในสภาพแวดล้อมแซนด์บ็อกซ์

local function sandboxFile(path, env)
  local chunk, err = loadfile(path, "t", env)
  if not chunk then return nil, err end
  local ok, result = pcall(chunk)
  if not ok then return nil, result end
  return result
end

การให้สิทธิ์เข้าถึงเอพีไอ

ให้ปลั๊กอินในแซนด์บ็อกซ์เข้าถึงเอพีไอของแอปที่จำกัดสิทธิ์ โดยใส่เฉพาะเมธอดที่ปลอดภัยไว้ในสภาพแวดล้อม

local pluginEnv = setmetatable({
  app = {
    on       = function(e,f) app:on(e,f) end,
    emit     = function(e,...) app:emit(e,...) end,
    log      = function(msg) app:log(msg) end,
  },
}, {__index = safeEnv})

การป้องกันการเข้าถึง _ENV

ห้ามใส่ _G, _ENV หรือ load ไว้ในแซนด์บ็อกซ์ สิ่งเหล่านี้เปิดทางให้หลบหนีออกจากสภาพแวดล้อมที่จำกัดสิทธิ์

การนับคำสั่งด้วย debug.sethook

ป้องกันลูปไม่สิ้นสุดโดยนับคำสั่งที่ทำงานแล้วหยุดการทำงานเมื่อถึงขีดจำกัด

local function withLimit(fn, maxInstructions)
  local count = 0
  debug.sethook(function()
    count = count + 1
    if count > maxInstructions then
      error("Instruction limit exceeded")
    end
  end, "", 100)
  local ok, err = pcall(fn)
  debug.sethook()
  return ok, err
end

ขีดจำกัดหน่วยความจำ

ใช้การนับคำสั่งร่วมกับการตรวจสอบ collectgarbage("count") เป็นระยะ เพื่อหยุดการทำงานหากการใช้หน่วยความจำเกินค่าที่กำหนด

การดักจับผลลัพธ์

แทนที่ print ในสภาพแวดล้อมแซนด์บ็อกซ์ด้วยฟังก์ชันกำหนดเองที่ดักจับผลลัพธ์ลงบัฟเฟอร์ แทนการเขียนไปยังเอาต์พุตมาตรฐาน

สิ่งที่ควรหลีกเลี่ยงเพื่อป้องกันการหลบหนีจากแซนด์บ็อกซ์

ช่องทางหลบหนีที่รู้จัก ได้แก่ debug.getupvalue การใช้ getmetatable กับวัตถุมาตรฐาน และการใช้ coroutine.wrap กับโค้ดอันตราย ตรวจสอบรายการทั้งหมดในสภาพแวดล้อมอย่างรอบคอบ

คำถามเรื่องแซนด์บ็อกซ์

จะป้องกันไม่ให้โค้ดในแซนด์บ็อกซ์เรียกใช้ os.execute ได้อย่างไร

สรุป: การใช้แซนด์บ็อกซ์กับปลั๊กอิน

สร้าง _ENV แบบบัญชีอนุญาตที่มีเฉพาะเอพีไอที่ปลอดภัย โหลดโค้ดปลั๊กอินด้วย load(code, name, "t", safeEnv) ใช้การนับคำสั่งเพื่อป้องกันลูปไม่สิ้นสุด ห้ามใส่ load, debug หรือ _G ไว้ในแซนด์บ็อกซ์

คำถามที่พบบ่อย

บทเรียน “การแซนด์บ็อกซ์การทำงานของปลั๊กอิน” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การแซนด์บ็อกซ์การทำงานของปลั๊กอิน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การแซนด์บ็อกซ์การทำงานของปลั๊กอิน”

เรียกใช้ปลั๊กอินในสภาพแวดล้อมจำกัดด้วย setfenv/load และ _ENV แบบกำหนดเอง คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การแซนด์บ็อกซ์การทำงานของปลั๊กอิน” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. การค้นหาและโหลดปลั๊กอิน
  2. API ปลั๊กอินและระบบฮุก
  3. การแซนด์บ็อกซ์การทำงานของปลั๊กอิน
  4. การจัดการเวอร์ชันและการพึ่งพา
← กลับไปที่ Lua Academy