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__
dalexec
contesto 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
exec
contesto, 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.NodeVisitor
per 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
PyPy
o qualcosa di simile a sandbox il codice.
NOTA: sono consapevole che esiste almeno un interprete basato su JavaScript. Questo non funzionerà nel mio scenario.