2014-07-19 16 views
15

Chcę dodać funkcję do mojej witryny, aby umożliwić użytkownikom wyszukiwanie tekstów za pomocą RegEx. Ale czy można bezpiecznie pozwolić użytkownikom robić coś takiego?Czy korzystanie z funkcji RegEx użytkownika jest bezpieczne?

preg_match('/' . $user_input_regex . '/', $subject); 
+3

Prawdopodobnie będziesz musiał uciec z tego przy użyciu [preg_quote()] (http://www.php.net/manual/en/function.preg-quote.php) i nie jest łatwo przechwycić błędy z wdziękiem, jeśli wejście użytkownika jest zniekształconym wyrażeń regularnych. –

+3

@MarkBaker Ale jeśli uniknę znaków RegEx z preg_quote(), RegEx nie zadziała –

+0

Osobiście ten kod wygląda dobrze dla mnie. Nie jestem ekspertem, ale to polecenie nie może niczego edytować ... Najgorsze, co mogą zrobić, to dać nieudane wyniki. Jednak jest to inna historia, jeśli używasz RegExes od różnych użytkowników. –

Odpowiedz

12

Istnieje możliwość ataku na ten kod o nazwie ReDoS attack (Wyrażenie regularne Denial of Service).

Regularne Denial wyrażenie usługi (REDOS) jest ataku Denial of Service, który wykorzystuje fakt, że większość Regularne implementacje ekspresyjne może osiągać ekstremalne sytuacje, które powodują ich do pracy bardzo powoli (wykładniczo związane z wielkością wejściowego). Następnie atakujący może spowodować, że program wykorzystujący Wyrażenie regularne wejdzie w te ekstremalne sytuacje, a następnie zawiesi się na bardzo długi czas.

W szczególności z preg_match jest known issue, który może powodować błąd segmentacji PHP.

Odpowiedź brzmi: nie, nie jest bezpieczna z powodu takich problemów.

+0

1. W przypadku ReDoS osoba atakująca może zwolnić serwer, ale nie może wyrządzić żadnych szkód, prawda? –

+0

2. PHP nie "wyjdzie", gdy pamięć żądania przekroczy limit pamięci? Chodzi mi o to: czy mogę zapobiec problemowi, zmniejszając limit pamięci i nie pozwalając jednocześnie na zbyt wiele wyszukiwań? –

+1

@SdgsdgAsgasgf: 1) Poza tym, że serwer nie reaguje na wszystkie żądania, nie. 2) Tam [może być obejście dla segfault] (http://php.net/manual/en/function.preg-match.php#88587). – SilverlightFox

4

Bezpieczeństwo nie należy nigdy ufać wprowadzaniu danych przez użytkownika, więc zależy to od tego, co robimy z danymi wejściowymi. W danym przypadku powinieneś przynajmniej uciec z używanego separatora (odwrotnego ukośnika) w danych wejściowych użytkownika, aby upewnić się, że działa ono.

Powiązane problemy