Se Sto valutando una stringa Python usando eval(), e ho una classe come:Sicurezza di eval di Python() su stringhe non attendibili?
class Foo(object):
a = 3
def bar(self, x): return x + a
Quali sono i rischi per la sicurezza, se non mi fido della stringa? In particolare:
- È
eval(string, {"f": Foo()}, {})
pericoloso? Cioè, puoi raggiungere os o sys o qualcosa di non sicuro da un'istanza di Foo? - È
eval(string, {}, {})
pericoloso? Cioè, posso raggiungere os o sys interamente da builtin come len e list? - C'è un modo per rendere i build non presenti affatto nel contesto di valutazione?
Ci sono alcune stringhe non sicure come "[0] * 100000000" Non mi interessa, perché nel peggiore dei casi rallentano/fermano il programma. Sono principalmente preoccupato di proteggere i dati utente esterni al programma.
Ovviamente, eval(string)
senza dizionari personalizzati non è sicuro nella maggior parte dei casi.
sì, se c'è sys.dostuff di importazione nella stringa su cui si sta facendo eval e non ci si fida della roba delle stringhe può diventare davvero brutta. – Vasil
eval ha la bella proprietà che consente solo espressioni. Quindi cose come =, import e print non sono permesse. –
Prova 'eval ('__ import __ (" sys "). Stdout.write (" Hello Joe ")')' –