0Pricing
Lua Academy · Lección

Construcción de un sandbox restringido

Cree una lista blanca segura en _ENV y ejecute código que no sea de confianza con load().

Construcción de un sandbox restringido es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 2 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.

Objetivo

Un sandbox restringido permite ejecutar código Lua que no sea de confianza de forma segura: puede realizar cálculos y usar cadenas y operaciones matemáticas, pero no puede acceder al sistema de archivos, al sistema operativo ni a la red.

Enfoque de lista blanca

Construya el entorno del sandbox desde cero e incluya únicamente funciones seguras y bien conocidas.

local function makeSandbox()
  return {
    print   = print,
    type    = type,
    tostring = tostring,
    tonumber = tonumber,
    pairs   = pairs,
    ipairs  = ipairs,
    next    = next,
    select  = select,
    unpack  = table.unpack,
    error   = error,
    pcall   = pcall,
    xpcall  = xpcall,
    math    = math,
    string  = { format=string.format, find=string.find,
                match=string.match, gmatch=string.gmatch,
                gsub=string.gsub, sub=string.sub,
                len=string.len, byte=string.byte, char=string.char },
    table   = { insert=table.insert, remove=table.remove,
                concat=table.concat, sort=table.sort,
                unpack=table.unpack, move=table.move },
  }
end

Ejecución de código en el sandbox

Cargue y ejecute el código del usuario utilizando el sandbox como su _ENV.

local function runSandboxed(code, env)
  local fn, err = load(code, "user", "t", env)
  if not fn then return nil, err end
  return pcall(fn)
end
local env = makeSandbox()
local ok, err = runSandboxed("return 1+1", env)
print(ok, err)  -- true  2

Captura de la salida

Sustituya print por una función personalizada que añada datos a un búfer en lugar de escribir en stdout.

local output = {}
env.print = function(...)
  local parts = {}
  for i = 1, select("#", ...) do
    parts[i] = tostring(select(i, ...))
  end
  output[#output+1] = table.concat(parts, "\t")
end

Devolución de valores

Para permitir que el código del sandbox devuelva valores, llame al chunk compilado como una función y capture sus valores devueltos.

local fn = load("return math.sqrt(144)", "user", "t", env)
if fn then
  local ok, result = pcall(fn)
  print(ok, result)  -- true  12.0
end

Bloqueo de exploits de met métodos

El código del sandbox no debe obtener referencias a metatablas ni a rawget/rawset para evitar eludir las restricciones de campos.

Limitación de la longitud de las cadenas

Sobrescriba las operaciones con cadenas para limitar la longitud de la salida y evitar ataques DoS mediante asignaciones de cadenas enormes.

Límites de recursos con debug.sethook

Añada un hook contador de instrucciones para terminar el código que no finaliza.

local function sandboxWithLimit(code, env, maxOps)
  local ops = 0
  debug.sethook(function()
    ops = ops + 1
    if ops > maxOps then error("Instruction limit exceeded") end
  end, "", 100)
  local result = table.pack(runSandboxed(code, env))
  debug.sethook()
  return table.unpack(result, 1, result.n)
end

Prueba del sandbox

Escriba pruebas que intenten vectores de escape conocidos: acceder a _G, llamar a load y utilizar debug, y compruebe que todos fallen.

Vectores de escape conocidos

Rutas de escape habituales: string.rep("x",2^30) (DoS de memoria), ({}).__index en objetos estándar, debug mediante la metatabla de strings e io mediante package.loaded.

Pregunta sobre el sandbox

¿Por qué un sandbox no incluye load ni dofile?

Resumen: creación de un sandbox restringido

Incluya en una tabla env personalizada únicamente funciones seguras. Utilice load(code, name, "t", env). Añada un contador de instrucciones con debug.sethook. Pruebe los vectores de escape. No incluya nunca load, dofile, debug ni el acceso a la tabla global.

Preguntas frecuentes

¿La lección «Construcción de un sandbox restringido» es gratis?

Sí — el texto completo de «Construcción de un sandbox restringido» 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 «Construcción de un sandbox restringido»?

Cree una lista blanca segura en _ENV y ejecute código que no sea de confianza con load(). 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 2 de 4.

¿Cuánto tiempo toma la lección «Construcción de un sandbox restringido»?

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