Non ho esperienza negli ambienti di sandboxing, ma qui ci sono i miei 2 centesimi:
Ho lavorato su Google App Engine, sia Java che Python e GAE ha il proprio ambiente sandbox. Parlando di consentire agli utenti di eseguire il codice, scherzi / utenti malvagi potrebbero provare ad abusare del tuo server a livello di programmazione o possono effettuare transazioni illegali (tramite chiamate http) dal tuo server. Inoltre non ho molta conoscenza in PHP, quindi scusami per eventuali ipotesi sbagliate.
Abusing your server:
CPU : potrebbero scrivere un ciclo continuo senza fine che consuma solo la CPU. Potrebbero scrivere codice con un elevato utilizzo della CPU.
Memoria : potrebbero scrivere codice creando oggetti in memoria e non liberandoli.
Cosa fa Google:
- Hanno un limite di 30 secondi per elaborare la richiesta, dopo 30 secondi, uccidono il thread.
- Menzionano in TOS che possono rimuovere l'app se consuma una CPU più alta. Forse hanno trigger automatici che mostrano le app che non utilizzano la CPU in modo efficiente.
Cosa potresti fare:
- Limita il tempo di esecuzione del codice, diciamo 10 o 15 secondi (o anche meno) a seconda dei casi d'uso.
- Mentre il programma è in esecuzione, registra le statistiche della CPU di ogni esecuzione del programma (con nome utente) e segnala quegli utenti che eseguono frequentemente codice inefficiente e emette un avviso / li manda in blocco.
- Immagino che avresti avviato ogni codice inviato dall'utente in un nuovo processo, limitando la memoria di quel programma, ad esempio 32 MB. Scegli il numero in base alla necessità.
Illegal network activity:
Potrebbero inviare email / hit server per raschiare dati. È illegale raschiare il contenuto di diversi siti.
Se le richieste HTTP sono fuori ambito nel tuo contesto, trova un modo per disabilitare qualsiasi codice di richiesta HTTP. Se è necessario fornire questa funzionalità, suppongo che si dovrà monitorare la larghezza di banda consumata da ciascun utente che esegue i propri programmi. Chiunque usi oltre qualche KB (dal momento che non scaricano i media come fanno i browser) è discutibile. Posso pensare ad un'altra alternativa per questo caso, che ritengo sia fattibile. Ne parlerò comunque - La soluzione richiede Javascript: dal codice inviato, filtrare le richieste HTTP, eseguire le richieste HTTP dal browser del mittente del codice stesso (utilizzando JavaScript, ovviamente), una volta ricevuta la risposta, inviare il codice e la risposta al tuo server per l'elaborazione. Elimina il tuo server dall'equazione delle richieste HTTP esterne. Tuttavia, sarà davvero necessario bloccare anche le richieste di rete dal processo sul lato server.
Spero che questo aiuti.
PS: per qualche ragione, credo che questa domanda appartenga a Stackoverflow. Hai provato lì?