2013-05-23 19 views
7

Wiemy Pythona eval() jest złaJak bezpieczne jest sympirowanie SymPy (<string>) .evalf()?

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

i wątków, StackOverflow sugerują użycie SymPy na evalf().

Jako początkujący Python, nie mogę naprawdę przekonać siebie, że evalf() jest bezpieczny, ponieważ brakuje mi umiejętności. Czy ktokolwiek może rozwinąć to, co robi evalf()?

+0

Nie ma sugestii, aby użyć 'evalf' zamiast' eval', ponieważ nie mają ze sobą nic wspólnego. Istnieją sugestie użycia 'sympify' zamiast' eval', ale (z punktu widzenia bezpieczeństwa) są one błędne, ponieważ są zasadniczo takie same. – Krastanov

Odpowiedz

7

Nie ma nic wspólnego między pytona eval i sympy evalf (ten ostatni jest do obliczania wartości liczbowej sympy drzew ekspresyjnych i ma nic do czynienia z parsowania, natomiast eval jest o parsowania ciąg i oceniając je jako jeśli jest to kod).

Z drugiej strony jest tak samo niebezpieczny jak eval, ponieważ w rzeczywistości używa on eval.

Istnieją dwa podstawowe tryby, w których sympify jest używane i prawdopodobnie jest to zły pomysł, ale oni mieszać w tej samej funkcji:

  • sympify(some_object) zwróci reprezentację obiektu bardziej nadaje się do stosowania w CAS, jak przekształcenie int(1) w sympy.Integer(1)

  • sympify("some_text") by zanalizować tekst niemal bezpośrednio przez eval (szukaj importu z sympy.parsing Obecnie w sympify i wykonaj go). Jest bezpieczniejsze, ponieważ istnieją pewne ograniczenia, ale jest to nie bezpieczne.

+0

Dziękuję za odpowiedź. Czy mógłbyś rozwinąć drugi podstawowy tryb, 'sympify (" jakiś tekst ")' i jak to może być wykorzystane złośliwie? Na przykład, przykładowy przykład [Ned Batchelder's eval dangerous] (http://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html) działa w SymPy? EG nazywające 'f = sympy.sympify ('__ import __ (" os ")')' nie daje mi obiektu do wywołania. –

+2

OK, udało mi się uzyskać dostęp do 'subprocess.Popen' przy pomocy sympify i uruchomić polecenie systemowe, EG' f = sympy.sympify ("" "[] .__ klasa __.__ base __.__ subclasses __() [158] ('ls ")" "") "wymieniono zawartość mojego katalogu. Stąd wystarczy prosty krok do 'rm -rf \'. Dobra robota [@Krastanov] (http://stackoverflow.com/users/669329/krastanov) udowodniłeś, że sympy jest ** nie ** bezpieczne! Sympy jest niebezpieczny. –