0Pricing
Lua Academy · Lección

El modelo _ENV en Lua 5.2+

Comprenda cómo _ENV sustituyó a setfenv y permite controlar el entorno.

El modelo _ENV en Lua 5.2+ es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué es _ENV?

En Lua 5.2+, cada chunk tiene un upvalue implícito denominado _ENV. Todos los accesos a variables globales se reescriben como accesos a campos de _ENV. Por tanto, print(x) se convierte en _ENV.print(_ENV.x).

_ENV reemplaza a setfenv

En Lua 5.1, setfenv(fn, env) cambiaba el entorno global de una función. En 5.2+, esto desaparece. En su lugar, establezca _ENV como variable local para cambiar el entorno de un chunk o bloque.

Cambio de _ENV en un chunk

Establezca _ENV al principio de un chunk para redirigir todos los accesos globales.

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

_ENV local para un bloque

Limite los cambios de _ENV a un bloque do...end para restringir su efecto.

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

Uso de load con _ENV

load(chunk, chunkname, mode, env) ejecuta una cadena como un chunk con un entorno personalizado. Este es el mecanismo principal para crear un sandbox en 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

Lectura del _ENV actual

El entorno global del chunk actual es _ENV. Para obtener una referencia: local myEnv = _ENV.

Modificación de _ENV en tiempo de ejecución

Establecer una variable global se hace mediante _ENV.varName = value. Como _ENV es un upvalue, puede sustituirlo por otra tabla en cualquier punto del código.

Herencia con __index

Proporcione al entorno del sandbox una metatabla con __index = _G para recurrir a la tabla global real cuando se trate de funciones que no haya bloqueado explícitamente.

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

Detección de intentos de acceso a _ENV

Sustituya las variables globales peligrosas por un valor centinela que registre los intentos de acceso para auditorías de seguridad.

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

Nota de compatibilidad

Las bibliotecas que utilizan setfenv/getfenv de Lua 5.1 deben reescribirse para 5.2+. Algunas utilizan una capa de compatibilidad en el código de inicialización.

Impacto práctico

El modelo _ENV hace que la creación de sandboxes sea más sencilla y coherente. Existe un mecanismo claro para los entornos, en lugar de dos (setfenv para funciones frente a las variables globales de nivel superior).

Pregunta sobre _ENV

¿Cómo reescribe Lua 5.2+ el acceso global print(x)?

Resumen: modelo _ENV

Lua 5.2+ hace que todos los accesos globales pasen por el upvalue _ENV. Utilice load(code, name, "t", env) para ejecutar código en un entorno personalizado. Este es el mecanismo estándar de creación de sandboxes que reemplaza a setfenv.

Preguntas frecuentes

¿La lección «El modelo _ENV en Lua 5.2+» es gratis?

Sí — el texto completo de «El modelo _ENV en Lua 5.2+» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué aprenderé en «El modelo _ENV en Lua 5.2+»?

Comprenda cómo _ENV sustituyó a setfenv y permite controlar el entorno. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Lua Academy?

No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «El modelo _ENV en Lua 5.2+»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Lua Academy?

Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. El modelo _ENV en Lua 5.2+
  2. Construcción de un sandbox restringido
  3. Prevención de escapes del sandbox
  4. Límites de recursos e instrumentación
← Volver a Lua Academy