Lua 5.2+의 _ENV 모델
_ENV가 setfenv를 대체하고 환경 제어를 가능하게 하는 방식을 이해합니다.
Lua 5.2+의 _ENV 모델은(는) CoddyKit의 무료 Lua Academy 강의입니다. 이것은 4개 중 1번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Lua Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
_ENV란 무엇인가요
Lua 5.2+에서는 모든 청크에 _ENV라는 암시적 업밸류가 있습니다. 모든 전역 변수 접근은 _ENV의 필드 접근으로 다시 작성됩니다. 따라서 print(x)는 _ENV.print(_ENV.x)가 됩니다.
setfenv를 대체하는 _ENV
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
효과를 제한하려면 do...end 블록 안에서 _ENV 변경의 범위를 지정합니다.
do
local _ENV = {print = print, x = 42}
print(x) -- 42 from local _ENV
end
print(x) -- original _ENV.x (global x)_ENV와 함께 load 사용
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
})호환성 참고 사항
Lua 5.1의 setfenv/getfenv를 사용하는 라이브러리는 5.2+에 맞게 다시 작성해야 합니다. 일부 라이브러리는 초기화 코드에서 호환성 계층을 사용합니다.
실무적 영향
_ENV 모델은 샌드박스화를 더 깔끔하고 일관되게 만듭니다. 최상위 전역에 사용하는 setfenv와 함수에 사용하는 전역이라는 두 가지 메커니즘 대신 환경을 위한 명확한 메커니즘 하나를 제공합니다.
_ENV 관련 질문
Lua 5.2+에서는 전역 접근 print(x)을 어떻게 다시 작성하나요?
요약: _ENV 모델
Lua 5.2+에서는 모든 전역 접근이 _ENV 업밸류를 거치도록 합니다. load(code, name, "t", env)를 사용하여 사용자 지정 환경에서 코드를 실행합니다. 이는 setfenv를 대체하는 표준 샌드박스화 메커니즘입니다.
자주 묻는 질문
“Lua 5.2+의 _ENV 모델” 강의는 무료인가요?
네 — “Lua 5.2+의 _ENV 모델” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Lua Academy 강의 전체를 잠금 해제할 수 있습니다. Lua Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“Lua 5.2+의 _ENV 모델”에서 뭘 배우나요?
_ENV가 setfenv를 대체하고 환경 제어를 가능하게 하는 방식을 이해합니다. 브라우저에서 직접 실행하는 실습 코드로 Lua Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Lua Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Lua Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 1번째 강의입니다.
“Lua 5.2+의 _ENV 모델” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Lua Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Lua Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- Lua 5.2+의 _ENV 모델
- 제한된 샌드박스 만들기
- 샌드박스 탈출 방지
- 리소스 제한과 계측