2014-08-31 18 views
7

Dire che voglio consentire a un utente di immettere qualsiasi espressione regolare che desidera e una stringa da abbinare, e verificherò se corrisponde a quello utilizzato con Python re.compile. È sicuro? C'è un modo per un utente malintenzionato di arrestarsi in modo anomalo o ottenere l'esecuzione remota passando stringhe appositamente predisposte?Sicurezza delle espressioni regolari

+2

Come nota a margine, a seconda delle esigenze, forse vale la pena considerare un'espressione _glob_ semplice, piuttosto che un'espressione regolare a pieno titolo. Per la maggior parte degli utenti è più facile da capire. E richiederà molto meno potere per elaborare. Ma di nuovo, dipenderà dai tuoi bisogni ... –

risposta

9

Non penso che lo re.compile() sarà un problema. Ovviamente può generare un'eccezione con espressioni regex non valide, ma è possibile individuarle facilmente. Le regex di Python non consentono callout di codice (a differenza di Perl, ad esempio), quindi non vedo un meccanismo che un utente malintenzionato potrebbe utilizzare per iniettare codice dannoso in un'espressione regolare.

effettivamente in esecuzione la regex (via re.search() ecc) può essere un problema, però, perché Python non prende alcuna precauzione contro catastrophic backtracking che possono causare runtime del regex a salire alle stelle.

Potrebbe essere una buona idea eseguire la regex in un processo dedicato e ucciderlo se non finisce entro un secondo circa.