[Python] mod_python ed il giusto handler

Valentino Volonghi aka Dialtone dialtone a divmod.com
Ven 18 Ago 2006 21:50:38 CEST


On Fri, 18 Aug 2006 20:48:52 +0200, Andrea Giammarchi <andrea a 3site.it> 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().


Maggiori informazioni sulla lista Python