Sto generando immagini dinamiche in un servizio web. La configurazione corrente è:
- Richiesta
image.py
-
image.py
esegue una ricerca nel database per determinare quali dati utilizzare per generare l'immagine -
image.py
chiama un sub-script (dato dal database, ad esempiocats.py
) per generare la particolare immagine
Quindi image.py
contiene il codice standard del wrapper e cats.py
disegna i gatti ( dogs.py
attirerebbe naturalmente i cani). Vorrei generalizzare questa configurazione in modo che gli utenti possano fornire il proprio codice di tracciamento, soggetto alle mie variabili pre-fornite, principalmente la tela di stampa e la libreria math
.
Permettere il caricamento di script Python generici è ovviamente un problema di sicurezza sostanziale. Vorrei mantenere il mio server sotto il mio controllo ed evitare che venga utilizzato per far saltare spam su Internet; anche tenere a bada il server con loop e grandi strutture di dati è una preoccupazione, ma a mia conoscenza non c'è molto da fare (provate che mi sbaglio!).
Le seguenti misure saranno sufficienti per proteggersi dalle forme di abuso più flagranti?
- Chiama
image.py
come utente con autorizzazioni limitate (per evitare che gli utenti ottengano informazioni critiche sul server) - Disattiva le funzioni chiave come
__import__
,eval
,exec
, ecc. impostandole uguali aNone
-per limitare le funzionalità a un ambiente controllato (per evitare che gli utenti importino le librerie di rete e altre cose con brutto potenziale)
Sto distruggendo l'oggetto del database e tutte le variabili critiche prima di chiamare potenziali script utente. Una sfida è che sto restituendo errori Python quando esistono, modificando il tipo di contenuto del documento restituito. Ciò potrebbe consentire l'ispezione di alcune proprietà, ma è anche necessario per consentire il debug.
Ho trovato queste domande correlate, ma non sono sicuro che siano direttamente correlate:
Aggiornamento: vedo dal test che __import__ = None
in realtà non disabilita la parola chiave import
. Quindi forse questo concetto non funzionerà.