2012-05-14 6 views

Odpowiedz

2

Czy jest to łańcuch zdefiniowany przez użytkownika, czy taki, który definiujesz?

Jeśli jest to ciąg tworzysz, można użyć eval (eval("20 < 30")), ale jeśli ciąg jest podana przez użytkownika, może chcesz zdezynfekować go pierwszy ...

+2

Tworzę go. Bez obaw :) Eval jest naprawdę bardzo ładną i bardzo dużą luką bezpieczeństwa. – RickyA

0

ast.literal_eval nie powinien pracować ponieważ (od docs) "Dostarczony ciąg lub węzeł może składać się tylko z następujących literałowych struktur Pythona: łańcuchów, liczb, krotek, list, dykt, wartości logicznych i Brak.". Wyrażenie 20<30 wymaga pewnego rodzaju oceny, zanim zostanie zwrócone.

Bezpieczniejszą propozycją byłoby podzielenie struny na operatora i literal_eval z każdej strony, zanim przejdziemy na eval, tj.

import ast 

expr = "20 < 30" 
operator = "<" 
lhs,rhs = map(ast.literal_eval, map(str.strip, expr.split(operator))) 
eval("%s %s %s"%(lhs,operator,rhs)) 

Owijanie rzeczą w try, except klauzuli złapie jakieś błędy podczas oceny lhs,rhs wejściowych.

Powiązane problemy