Większość współczesnych języków (które są w jakiś sposób interpretowane) pełni funkcję ewaluacji . Taka funkcja wykonuje dowolny kod języka, przez większość czasu jako główny argument jako ciąg znaków (różne języki mogą dodawać więcej funkcji do funkcji eval).
Rozumiem, że użytkownikom nie powinno się zezwalać na wykonywanie tej funkcji ( edycja, tj. Pobieranie bezpośrednio lub pośrednio dowolnych danych wejściowych od dowolnego użytkownika do przekazania eval
), szczególnie w przypadku oprogramowania po stronie serwera, ponieważ mogą zmusić proces do wykonania złośliwego kodu. W ten sposób samouczki i społeczności mówią nam, aby nie używać eval. Jednak wiele razy eval jest użyteczny i używany:
- Niestandardowe reguły dostępu do elementów oprogramowania (IIRC OpenERP ma obiekt,
ir.rule
który może używać dynamicznego kodu python). - Niestandardowe obliczenia i / lub kryteria (OpenERP ma takie pola, aby umożliwić niestandardowe obliczenia kodu).
- Parsery raportów OpenERP (tak, wiem, że wariuję cię materiałami OpenERP ... ale to jest mój główny przykład).
- Kodowanie efektów zaklęć w niektórych grach RPG.
Więc mają dobre zastosowanie, o ile są właściwie używane. Główną zaletą jest to, że ta funkcja pozwala administratorom pisać niestandardowy kod bez konieczności tworzenia większej liczby plików i dołączania ich (chociaż większość frameworków korzystających z funkcji eval ma również sposób na określenie pliku, modułu, pakietu, ... do odczytu).
Jednak ewolucja jest złem w kulturze popularnej. Przychodzą mi na myśl rzeczy takie jak włamanie się do twojego systemu.
Istnieją jednak inne funkcje, które mogą być szkodliwe, jeśli w jakiś sposób są dostępne dla użytkowników: odłączanie, odczytywanie, zapisywanie (semantyka plików), alokacja pamięci i arytmetyka wskaźników, dostęp do modelu bazy danych (nawet jeśli nie uwzględnia się przypadków iniekcji SQL).
Zasadniczo więc przez większość czasu, gdy jakikolwiek kod nie jest napisany poprawnie lub nie jest właściwie obserwowany (zasoby, użytkownicy, środowiska, ...), kod jest zły i może prowadzić nawet do skutków ekonomicznych.
Ale jest coś specjalnego z eval
funkcjami (niezależnie od języka).
Pytanie : Czy istnieje jakiś historyczny fakt, że ten strach staje się częścią kultury popularnej, zamiast zwracać taką samą uwagę na inne potencjalnie niebezpieczne cechy?
eval
, ale ma wewnętrzną funkcję wywołującą , safe_eval
która przygotowuje środowisko do zapobiegania niebezpiecznym działaniom kodu. Znaleziono jednak błędy, ponieważ Python jest dość elastycznym językiem, a zatem trudnym do kontrolowania.