On Fri, 18 Aug 2006 20:48:52 +0200, Andrea Giammarchi <[EMAIL PROTECTED]> wrote:
e cosa potrà mai accadere per una cosa tipo questa ?

exec "class " + nome + ": pass"

l'unica linea di codice tolta dalla verisone PyRex ?

Senza il controllo che fai sotto io posso fare:

foo("Pifferazzo(__import__('os').listdir('.'))")
Traceback (most recent call last):
 File "<stdin>", line 1, in ?
 File "<stdin>", line 2, in foo
 File "<string>", line 1, in ?
TypeError: Error when calling the metaclass bases
   list() takes at most 1 argument (3 given)

Il che significa che l'espressione dentro Pifferazzo e` stata eseguita con 
successo e avrebbe potuto essere molto piu` distruttiva.

Però hai ragione, devo aggiungere un controllo sul nome della classe.

con un controllo sulla stringa che accetta solo lettere ed undesrcore, quante possibilità ci sono di fare danni ?

Un po` meno. Ma davvero poche in meno.

class Foo(object):
...     ciao = 3
...
Foo.ciao
3
exec "class Foo(object): pass"
Foo.ciao
Traceback (most recent call last):
 File "<stdin>", line 1, in ?
AttributeError: type object 'Foo' has no attribute 'ciao'

Il vero danno e` sovrascrivere nomi gia` esistenti nella tua applicazione oltre 
ad altri che spendendo abbastanza tempo si potrebbero trovare (attachi analoghi 
all'SQL injection ma fatta col codice).

Non ne vale proprio la pena... Meglio evitare la exec del tutto e assieme a 
quella la eval().
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a