[Python] alternative ad eval

Manlio Perillo manlio.perillo a gmail.com
Mar 18 Mar 2014 15:07:53 CET


2014-03-18 14:02 GMT+01:00 Dario Bertini <berdario a gmail.com>:

> 2014-03-18 13:39 GMT+01:00 Manlio Perillo <manlio.perillo a gmail.com>:
> > eval è relativamente sicuro, dato che può eseguire solo espressioni, e
> non
> > statement completi come exec.
> > Lo puoi rendere ancora più sicuro limitando il namespace, ad esempio:
>
> purtroppo, non basta:
> http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
> http://nedbatchelder.com/blog/201302/finding_python_3_builtins.html


Grazie, avevo dimenticato di disabilitare i builtins, ma sembra che ancora
non basti.

Allora, sempre usando gli strumenti già disponibili in Python, consiglio
all'OP di guardare il codice della funzione ast.literal_eval.

Esegue un eval, ma restituisce l'AST del codice compilato, in modo da
validare il codice da eseguire.   Risparmi un bel pò di tempo rispetto a
pyparsing, perchè usi la grammatica di Python.  Lo svantaggio è che
probabilmente devi gestire più casi.


> >
> > Questo però non basta, devi avere il controllo anche su value, ad esempio
> > accettando solo stringhe secondo un dato protocollo, di cui farai il
> parsing
> > e validazione.
> > Il mio protocollo preferito è "Typed NetStrings":
> >   "<typeid><len>:<literal>
> > Ad esempio per un intero:
> >   "i3:777"
> >
> > tale protocollo è facile da leggere, parsare e validare (perchè verboso)
> >
>
> sembra simile a un Type-Length-Value
>
> http://en.wikipedia.org/wiki/Type-length-value
>
>
Direi che è quello.


> se possibile, preferite linguaggi regolari ad un TLV o altro formato
> context-sensitive
>
> http://www.youtube.com/watch?v=v8F8BqSa-XY
> http://langsec.org
>
>
TLV non mi sembra abbia i problemi riportati in quei paper, ma non ho
approfondito.


Ciao  Manlio
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20140318/9f3127fd/attachment.html>


Maggiori informazioni sulla lista Python