Ho un progetto in cui devo consentire agli utenti di eseguire codice Python arbitrario e non attendibile ( un po 'come questo ) contro il mio server. Sono abbastanza nuovo su Python e vorrei evitare di commettere errori che introducano falle nella sicurezza o altre vulnerabilità nel sistema. Ci sono delle migliori pratiche disponibili, letture consigliate o altri suggerimenti che puoi darmi per rendere il mio servizio utilizzabile ma non abusabile?
Ecco cosa ho considerato finora:
- Rimuovere
__builtins__dalexeccontesto per vietare l'uso di pacchetti potenzialmente pericolosi comeos. Gli utenti potranno utilizzare solo i pacchetti che fornisco loro. - Utilizzare i thread per imporre un timeout ragionevole.
- Vorrei limitare la quantità totale di memoria che può essere allocata nel
execcontesto, ma non sono sicuro che sia possibile.
Ci sono alcune alternative a una scala exec, ma non sono sicuro di quale di questi sarebbe utile qui:
- Usare un
ast.NodeVisitorper catturare qualsiasi tentativo di accedere a oggetti non sicuri. Ma quali oggetti dovrei vietare? - Ricerca di eventuali sottolineature doppie nell'input. (meno grazioso dell'opzione sopra).
- Utilizzando
PyPyo qualcosa di simile a sandbox il codice.
NOTA: sono consapevole che esiste almeno un interprete basato su JavaScript. Questo non funzionerà nel mio scenario.