การแซนด์บ็อกซ์การทำงานของปลั๊กอิน
เรียกใช้ปลั๊กอินในสภาพแวดล้อมจำกัดด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การค้นหาและโหลดปลั๊กอิน
- API ปลั๊กอินและระบบฮุก
- การแซนด์บ็อกซ์การทำงานของปลั๊กอิน
- การจัดการเวอร์ชันและการพึ่งพา