2014-08-31 15 views
7

Załóżmy, że chcę, aby użytkownik wprowadził dowolne żądane wyrażenie regularne i ciąg do dopasowania, a ja sprawdzę, czy pasuje on do Pythona pod re.compile. Czy to bezpieczne? Czy istnieje sposób, aby złośliwy użytkownik mógł się zawiesić lub uzyskać zdalne wykonanie, przekazując specjalnie spreparowane ciągi?Bezpieczeństwo wyrażeń regularnych

+2

Jako wzmianka, w zależności od potrzeb, może warto rozważyć proste wyrażenie _glob_, zamiast pełnoprawnego regex. Dla większości użytkowników jest to łatwiejsze do zrozumienia. I będzie wymagało znacznie mniej energii do przetworzenia. Ale znowu będzie to zależało od twoich potrzeb ... –

Odpowiedz

9

Nie sądzę, że re.compile() będzie problemem. Oczywiście może on rzucić wyjątek z niepoprawnymi wyrażeń regularnych, ale możesz je łatwo złapać. Wyrażenia regularne w języku Python nie zezwalają na tworzenie objaśnień kodu (na przykład w przeciwieństwie do Perla), więc nie widzę mechanizmu, który napastnik mógłby użyć do wstrzyknięcia złośliwego kodu do regexu.

Rzeczywiste uruchamianie regex (przez re.search() itp.) Może być jednak problemem, ponieważ Python nie podejmuje żadnych środków ostrożności przeciwko catastrophic backtracking, co może spowodować, że środowisko wykonawcze regex dojdzie do przestrachu.

Dobrym pomysłem może być uruchomienie regexu w dedykowanym procesie i zabicie go, jeśli nie zakończy się w ciągu sekundy.

Powiązane problemy