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