0Pricing
Lua Academy · Lezione

Creazione di una sandbox limitata

Crei una whitelist _ENV sicura ed esegua codice non attendibile con load().

Creazione di una sandbox limitata è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.

Obiettivo

Una sandbox restrittiva consente di eseguire in sicurezza codice Lua non attendibile: può eseguire calcoli e utilizzare stringhe e funzioni matematiche, ma non può accedere al file system, al sistema operativo o alla rete.

Approccio della whitelist

Costruisca l'ambiente della sandbox da zero, includendo solo funzioni sicure e di cui si conosce bene il comportamento.

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

Esecuzione del codice nella sandbox

Carichi ed esegua il codice dell'utente con la sandbox come _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

Acquisizione dell'output

Sostituisca print con una funzione personalizzata che aggiunga i dati a un buffer invece di scriverli su 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

Restituzione dei valori

Per consentire al codice nella sandbox di restituire valori, chiami il chunk compilato come funzione e acquisisca i valori restituiti.

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

Blocco degli exploit dei metametodi

Il codice nella sandbox non dovrebbe ricevere riferimenti a metatabelle o a rawget/rawset, per evitare di aggirare le restrizioni sui campi.

Limitazione della lunghezza delle stringhe

Sovrascriva le operazioni sulle stringhe per limitare la lunghezza dell'output e prevenire attacchi DoS causati da allocazioni di stringhe enormi.

Limiti delle risorse con debug.sethook

Aggiunga un hook per contare le istruzioni e terminare il codice in esecuzione senza fine.

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

Test della sandbox

Scriva test che tentino vettori di evasione noti: accedere a _G, chiamare load, utilizzare debug, e verifichino che falliscano tutti.

Vettori di evasione noti

Percorsi di evasione comuni: string.rep("x",2^30) (DoS della memoria), ({}).__index sugli oggetti standard, debug tramite la metatabella delle stringhe, io tramite package.loaded.

Domanda sulla sandbox

Perché una sandbox non include load o dofile?

Riepilogo: creazione di una sandbox restrittiva

Inserisca nella tabella env personalizzata solo funzioni sicure. Utilizzi load(code, name, "t", env). Aggiunga il conteggio delle istruzioni con debug.sethook. Verifichi i vettori di evasione. Non includa mai load, dofile, debug o l'accesso alla tabella globale.

Domande Frequenti

La lezione «Creazione di una sandbox limitata» è gratuita?

Sì — il testo completo di «Creazione di una sandbox limitata» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.

Cosa imparerò in «Creazione di una sandbox limitata»?

Crei una whitelist _ENV sicura ed esegua codice non attendibile con load(). Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Lua Academy?

Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Creazione di una sandbox limitata»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Lua Academy?

Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Il modello _ENV in Lua 5.2+
  2. Creazione di una sandbox limitata
  3. Prevenzione delle evasioni dalla sandbox
  4. Limiti delle risorse e strumentazione
← Torna a Lua Academy