Jak bezpieczna jest ocena ekspresji za pomocą eval?
Buduję stronę internetową, w której mam potrzebę, aby użytkownik mógł ocenić jakieś wyrażenie na podstawie wartości w tabelach DB, zamiast używać narzędzi takich jak pyparsing itp., Myślę o używaniu samego Pythona i wymyśliłem rozwiązanie co jest wystarczające dla mojego celu. W zasadzie używam eval do oceny wyrażenia i przekazywania globalnego dyktatu z pustym__builtins__
tak, że nie można uzyskać dostępu do niczego, a lokalni dyktują wartości z DB, jeśli użytkownik będzie potrzebował pewnych funkcji, mogę je przekazać np.
import datetime
def today():
return datetime.datetime.now()
expression = """ first_name.lower() == "anurag" and today().year == 2010 """
print eval(expression, {'__builtins__':{}}, {'first_name':'Anurag', 'today':today})
Moje pytanie brzmi: jak bezpiecznie byłoby, mam trzy kryteria
Czy użytkownik może uzyskać dostęp do aktualnego stanu mojego programu lub tabeli itp. Someshow?Czy użytkownik może mieć dostęp do połączeń na poziomie OS?Czy użytkownik może zatrzymać mój system przez zapętlenie lub użycie dużej ilości pamięci, np. wykonując zakres (10 * 8), w niektórych przypadkach może np. 100 ** 1000 itd., więc 3 nie stanowi większego problemu. Mogę sprawdzić taki op z tokenize i tak czy inaczej będę używał GAE, więc nie ma większego problemu.Edytować: IMO to nie jest duplikatP: 661084 ponieważ tam, gdzie się kończy, zaczyna się, chcę wiedzieć nawet z__builtins__
zablokowany, czy użytkownik może robić złe rzeczy?