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 },
}
endEjecució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 2Captura 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")
endDevolució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
endBloqueo 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)
endPrueba 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
- El modelo _ENV en Lua 5.2+
- Construcción de un sandbox restringido
- Prevención de escapes del sandbox
- Límites de recursos e instrumentación