0Pricing
Lua Academy · Lezione

Limiti delle risorse e strumentazione

Utilizzi debug.sethook per contare le istruzioni e applicare budget di CPU.

Limiti delle risorse e strumentazione è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 4 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.

Perché limitare le risorse

Il codice non attendibile può causare un DoS eseguendo istruzioni senza fine (CPU), allocando enormi quantità di memoria o generando un output eccessivo. I limiti delle risorse proteggono l'host.

Limite della CPU tramite debug.sethook

Conteggi le istruzioni eseguite e interrompa l'esecuzione quando il limite viene superato.

local function withCPULimit(fn, maxOps)
  local ops = 0
  debug.sethook(function()
    ops = ops + 1
    if ops > maxOps then error("CPU limit exceeded", 2) end
  end, "", 50)  -- check every 50 instructions
  local ok, result = pcall(fn)
  debug.sethook()
  return ok, result
end

Granularità del conteggio

Il terzo argomento di sethook (count) controlla la frequenza di attivazione dell'hook. Valori più piccoli offrono maggiore precisione, ma comportano un overhead superiore. Un intervallo comune è 50-500.

Limite della memoria tramite collectgarbage

Controlli l'utilizzo della memoria all'interno dell'hook e interrompa l'esecuzione se supera una soglia.

local MEM_LIMIT_KB = 1024  -- 1 MB
debug.sethook(function()
  if collectgarbage("count") > MEM_LIMIT_KB then
    error("Memory limit exceeded")
  end
end, "", 200)

Limite del tempo reale

Combini questa tecnica con os.clock() per limitare il tempo trascorso, anziché il conteggio delle istruzioni o in aggiunta a esso.

local deadline = os.clock() + 0.5  -- 500ms
debug.sethook(function()
  if os.clock() > deadline then
    error("Time limit exceeded")
  end
end, "", 100)

Limite dell'output

Avvolga la funzione print della sandbox per conteggiare i byte scritti e rifiuti ulteriore output dopo il raggiungimento del limite.

local totalOutput = 0
local OUTPUT_LIMIT = 10240  -- 10 KB
env.print = function(...)
  local s = table.concat({...}, "\t") .. "\n"
  totalOutput = totalOutput + #s
  if totalOutput > OUTPUT_LIMIT then
    error("Output limit exceeded")
  end
  output[#output+1] = s
end

Strumentazione per il profiling

Utilizzi gli eventi hook "call" e "return" per creare un grafo delle chiamate strumentato del codice in sandbox.

local callGraph = {}
debug.sethook(function(event)
  local info = debug.getinfo(2, "Sn")
  local name = info.name or info.short_src
  if event == "call" then callGraph[name] = (callGraph[name] or 0) + 1 end
end, "c")

Hook delle coroutine

I limiti di debug.sethook si applicano per thread. Imposti gli hook su ogni coroutine singolarmente se il codice in sandbox crea coroutine.

Report sull'utilizzo delle risorse

Dopo l'esecuzione nella sandbox, riporti: istruzioni eseguite, memoria utilizzata, lunghezza dell'output e tempo trascorso. È utile per rilevare gli abusi e applicare le quote.

Sandbox annidate

Se un plugin in sandbox può creare a sua volta delle sotto-sandbox, si assicuri che i limiti delle risorse della sandbox principale vengano ereditati o resi più restrittivi per quella figlia.

Strumenti per la produzione

Strumenti: luasandbox (LuaJIT), container Docker per Lua con seccomp e allocator personalizzati che impongono un limite rigido alla memoria. Li combini con i cgroups a livello del sistema operativo per ottenere garanzie solide.

Domanda sui limiti delle risorse

In che modo debug.sethook impone un limite alla CPU?

Riepilogo: limiti delle risorse e strumentazione

Utilizzi debug.sethook per imporre limiti alla CPU (conteggio delle istruzioni), alla memoria (controllo con collectgarbage) e al tempo (os.clock). Avvolga print per limitare l'output. Dopo l'esecuzione, riporti l'utilizzo per il monitoraggio e l'applicazione delle quote.

Domande Frequenti

La lezione «Limiti delle risorse e strumentazione» è gratuita?

Sì — il testo completo di «Limiti delle risorse e strumentazione» è 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 «Limiti delle risorse e strumentazione»?

Utilizzi debug.sethook per contare le istruzioni e applicare budget di CPU. 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 4 di 4.

Quanto tempo richiede la lezione «Limiti delle risorse e strumentazione»?

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