2013-05-23 9 views
7

Sappiamo di Python eval() è il maleQuanto è sicuro Sympy sympify (<string>) .evalf()?

http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html

e le discussioni in tutto StackOverflow suggeriscono di utilizzare SymPy di ​​evalf().

Come un principiante Python, non posso davvero convincermi che evalf() sia sicuro perché mi mancano le competenze. Qualcuno può approfondire ciò che fa evalf() (diverso)?

+0

Non ci sono suggerimenti per utilizzare 'evalf' invece di' eval' in quanto non hanno nulla in comune. Ci sono suggerimenti per usare 'sympify' invece di' eval', ma (da un punto di vista della sicurezza) sono fuorvianti in quanto sono sostanzialmente uguali. – Krastanov

risposta

7

Non c'è nulla comune tra pitone eval e sympy evalf (quest'ultimo è per calcolare il valore numerico di alberi di espressione sympy e ha nulla a che fare con l'analisi, mentre eval è tutto analizzare una stringa e valutare come se è un codice).

D'altra parte, sympify è altrettanto pericoloso come eval, perché in realtà utilizza eval.

Ci sono due modalità di base in cui sympify è usato e probabilmente è una cattiva idea che hanno ottenuto mescolati nella stessa funzione:

  • sympify(some_object) restituirebbe una rappresentazione dell'oggetto più adatto per l'uso in un CAS, come trasformare int(1) in sympy.Integer(1)

  • sympify("some_text") sarebbe analizzare il testo quasi direttamente attraverso eval (ricerca per l'importazione da sympy.parsing presente in sympify e seguilo). È più sicuro in quanto vi sono alcuni vincoli ma è non sicuro.

+0

Grazie per la risposta. Potresti per favore elaborare la seconda modalità di base, 'sympify (" some text ")', e come potrebbe essere sfruttata maliziosamente? Ad esempio, l'esempio di [Ned Batchelder's eval dangerous] (http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html) funziona in SymPy? EG chiamando 'f = sympy.sympify ('__ import __ (" os ")')' non mi dà un oggetto callable. –

+2

OK, sono stato in grado di accedere a 'subprocess.Popen' utilizzando sympify ed eseguire un comando di sistema, EG' f = sympy.sympify ("" "[] .__ class __.__ base __.__ sottoclassi __() [158] ('ls ') "" ")' ha elencato il contenuto della mia directory. Da lì è sufficiente un semplice passaggio a 'rm -rf \'. Ben fatto [@Krastanov] (http://stackoverflow.com/users/669329/krastanov) hai dimostrato che sympy è ** non ** sicuro! Sympy è pericoloso. –

Problemi correlati