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

แบบจำลอง _ENV ใน Lua 5.2+

ทำความเข้าใจว่า _ENV เข้ามาแทนที่ setfenv และช่วยควบคุมสภาพแวดล้อมได้อย่างไร

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

_ENV คืออะไร

ใน Lua 5.2 ขึ้นไป ทุกชังก์จะมีอัปแวลูโดยนัยชื่อ _ENV การเข้าถึงตัวแปรส่วนกลางทั้งหมดจะถูกเขียนใหม่เป็นการเข้าถึงฟิลด์บน _ENV ดังนั้น print(x) จึงกลายเป็น _ENV.print(_ENV.x)

_ENV แทนที่ setfenv

ใน Lua 5.1 setfenv(fn, env) ใช้เปลี่ยนสภาพแวดล้อมส่วนกลางของฟังก์ชัน แต่ใน 5.2 ขึ้นไป ความสามารถนี้ถูกยกเลิก ให้กำหนด _ENV เป็นตัวแปรเฉพาะที่แทน เพื่อเปลี่ยนสภาพแวดล้อมของชังก์หรือบล็อก

การเปลี่ยน _ENV ในชังก์

กำหนด _ENV ไว้ที่ด้านบนของชังก์เพื่อเปลี่ยนเส้นทางการเข้าถึงตัวแปรส่วนกลางทั้งหมด

-- Everything in this chunk uses myEnv as globals
local _ENV = myEnv
print("hello")  -- calls myEnv.print("hello")

_ENV เฉพาะที่สำหรับบล็อก

จำกัดขอบเขตการเปลี่ยนแปลงของ _ENV ไว้ในบล็อก do...end เพื่อจำกัดผลกระทบ

do
  local _ENV = {print = print, x = 42}
  print(x)  -- 42 from local _ENV
end
print(x)  -- original _ENV.x (global x)

การใช้ load กับ _ENV

load(chunk, chunkname, mode, env) ประมวลผลสตริงเป็นชังก์ด้วยสภาพแวดล้อมแบบกำหนดเอง นี่คือกลไกหลักสำหรับการทำแซนด์บ็อกซ์ใน 5.2 ขึ้นไป

local env = {print = print, math = math}
local fn, err = load("print(math.sqrt(16))", "sandbox", "t", env)
if fn then fn() end  -- 4.0

การอ่าน _ENV ปัจจุบัน

ตัวแปรส่วนกลางของชังก์ปัจจุบันคือ _ENV หากต้องการรับการอ้างอิง ให้ใช้ local myEnv = _ENV

การแก้ไข _ENV ขณะทำงาน

การกำหนดค่าตัวแปรส่วนกลางคือ _ENV.varName = value เนื่องจาก _ENV เป็นอัปแวลู จึงสามารถสลับไปใช้ตารางอื่นได้ทุกจุดในโค้ด

การสืบทอดด้วย __index

กำหนดเมทาเทเบิลให้สภาพแวดล้อมของแซนด์บ็อกซ์ด้วย __index = _G เพื่อย้อนกลับไปใช้ตารางส่วนกลางจริงสำหรับฟังก์ชันที่ยังไม่ได้บล็อกอย่างชัดเจน

local sandboxEnv = setmetatable({}, {__index = _G})
-- then block dangerous ones:
sandboxEnv.os = nil
sandboxEnv.io = nil
sandboxEnv.load = nil

การตรวจจับความพยายามเข้าถึง _ENV

แทนที่ตัวแปรส่วนกลางที่เป็นอันตรายด้วยค่าเฝ้าระวัง ซึ่งจะบันทึกความพยายามเข้าถึงไว้สำหรับการตรวจสอบด้านความปลอดภัย

sandboxEnv.os = setmetatable({}, {
  __index = function(_, k)
    ngx.log(ngx.WARN, "Blocked access: os." .. k)
    return nil
  end
})

หมายเหตุด้านความเข้ากันได้

ไลบรารีที่ใช้ setfenv/getfenv ของ Lua 5.1 จำเป็นต้องเขียนใหม่สำหรับ 5.2 ขึ้นไป บางไลบรารีใช้ชิมความเข้ากันได้ในโค้ดเริ่มต้น

ผลกระทบในทางปฏิบัติ

รูปแบบ _ENV ทำให้การทำแซนด์บ็อกซ์สะอาดและสอดคล้องกันมากขึ้น โดยมีกลไกสำหรับสภาพแวดล้อมที่ชัดเจนเพียงแบบเดียว แทนที่จะมีสองแบบ คือ setfenv สำหรับฟังก์ชัน และตัวแปรส่วนกลางสำหรับระดับบนสุด

คำถามเกี่ยวกับ _ENV

Lua 5.2 ขึ้นไปเขียนการเข้าถึงตัวแปรส่วนกลาง print(x) ใหม่อย่างไร

ทบทวน: รูปแบบ _ENV

Lua 5.2 ขึ้นไปทำให้การเข้าถึงตัวแปรส่วนกลางทั้งหมดทำผ่านอัปแวลู _ENV ใช้ load(code, name, "t", env) เพื่อประมวลผลโค้ดในสภาพแวดล้อมแบบกำหนดเอง นี่คือกลไกมาตรฐานสำหรับการทำแซนด์บ็อกซ์ที่มาแทนที่ setfenv

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

บทเรียน “แบบจำลอง _ENV ใน Lua 5.2+” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “แบบจำลอง _ENV ใน Lua 5.2+”

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

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

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

บทเรียน “แบบจำลอง _ENV ใน Lua 5.2+” ใช้เวลานานแค่ไหน

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

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

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

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

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