Cosa significa "sandbox" nel contesto di un programmatore?
Un sandbox è un ambiente vincolato in cui si esegue un programma, per impedire che quel programma acceda a risorse (memoria, file, librerie, ecc.) al di fuori di quell'ambiente, di solito allo scopo di proteggere il resto del computer da codice possibilmente maligno (o forse solo possibilmente difettoso) in quel programma.
Come esattamente questo è implementato varia a seconda della tecnologia. Generalmente implica un certo grado di emulazione o simulazione dell'hardware, così che l'emulatore/simulatore essenzialmente finge di essere l'hardware, e le istruzioni del programma che normalmente interagirebbero con l'hardware in realtà interagiscono con questo hardware simulato, che poi relaziona (o meno) la richiesta attraverso l'hardware reale.
Come spiegazione metaforica, trapiantiamo il contesto ai computer e alla rete:
Immaginate di avere un computer che esegue un programma, e questo programma comunica con altri programmi, in esecuzione su altri sistemi, attraverso la rete. Un esempio comune in questi giorni è l'uso delle richieste HTTP come API.
Diciamo che qualcuno vi dia questo computer e vi chieda di collegarlo alla vostra rete e di accenderlo. Ma non siete del tutto sicuri di fidarvi del codice nel computer, per qualsiasi motivo, ma volete comunque eseguirlo.
Invece di collegare semplicemente il computer sospetto alla rete principale, create una piccola rete hardware separata, e la connessione tra questa rete separata e il resto della rete è un router/firewall che permetterà solo selettivamente ad alcuni pacchetti di passare avanti e indietro tra le due reti.
Andate oltre, ed eseguite un proxy server HTTP sul router/firewall. Il server proxy funge da intermediario, intercettando le richieste HTTP in uscita dal computer sospetto, esaminandole, facendo la richiesta equivalente alla rete esterna, quindi rispondendo alla richiesta originale con i risultati.
Allora si aggiunge del codice al server proxy in modo che possa essere esigente riguardo a quali tipi di richieste HTTP, a quali indirizzi, con quali tipi di contenuti di richiesta, trasmetterà.
Questo è essenzialmente ciò che fa una sandbox, tranne che invece di mettersi tra un computer sospetto e il resto della rete, si mette tra un programma sospetto e il resto del computer.
Un termine per questo è "macchina virtuale"; i programmi java sono eseguiti sulla JVM, la Java Virtual Machine. La JVM non è la prima macchina virtuale, né l'unica, ma è probabilmente la più famosa.
I programmi java sono compilati in "bytecode" che è un insieme di istruzioni per un'architettura di macchina immaginaria, definita dagli standard java. Il bytecode viene eseguito sulla JVM, e la JVM esegue una serie di controlli per assicurarsi che il bytecode non infranga nessuna delle regole di sicurezza.
Il compilatore java dovrebbe aver impedito che tali violazioni finiscano nel bytecode, ma è abbastanza possibile che qualcuno con le giuste conoscenze modifichi direttamente il file bytecode e cambi le cose per provare qualcosa di subdolo, quindi la JVM controlla prima di eseguire il bytecode.
Nota che questi termini, macchina virtuale, bytecode, ecc, non sono standardizzati. Non sono gli unici termini usati per questo genere di cose, e non sono sempre usati nello stesso senso. E, naturalmente, in questi giorni si usa anche VM per riferirsi non solo a una macchina virtuale che esegue qualche linguaggio, ma una che simula un computer completo.
Similmente, mi sono imbattuto in alcuni linguaggi e discussioni che si riferiscono allo "pseudocodice" invece che al bytecode, ma lo pseudocodice è anche usato, e molto più comunemente, per riferirsi all'uso di una sorta di inglese semplificato (o altro linguaggio di facile utilizzo) per delineare un programma in una fase di progettazione o di insegnamento. Il senso di VM/sandbox/interprete della parola sembra essersi estinto nell'uso comune dei programmatori, il che è probabilmente una buona cosa, abbiamo già abbastanza confusione.
Articoli simili
- Qual è la differenza tra contesto, contesto dell'attività e contesto dell'applicazione nella programmazione Android?
- Cos'è una sandbox e perché usiamo una sandbox?
- Quanto difficile/quanto tempo ci vuole per fare un semplice gioco sandbox per un programmatore intermedio, in particolare su Unity (usando C#)?
- Cosa significa 'federato' nel contesto dello sviluppo del software?