0Pricing
Lua Academy · 강의

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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Lua 5.2+의 _ENV 모델
  2. 제한된 샌드박스 만들기
  3. 샌드박스 탈출 방지
  4. 리소스 제한과 계측
← Lua Academy(으)로 돌아가기