2014-07-19 7 views
15

Ich möchte ein Feature zu meiner Website hinzufügen, damit Benutzer die Texte mit RegEx suchen können. Aber ist es sicher, die Benutzer so etwas tun zu lassen?Ist es sicher, BenutzerregEx zu verwenden?

+3

Sie müssten wahrscheinlich mit [preg_quote()] (http://www.php.net/manual/en/function.preg-quote.php) entkommen, und es ist nicht einfach, Fehler einzufangen anmutig, wenn die Benutzereingabe eine missgebildete Regexp ist –

+3

@MarkBaker Aber wenn ich die RegEx Zeichen mit preg_quote() entkommen die RegEx wird nicht funktionieren –

+0

Persönlich sieht dieser Code gut für mich. Ich bin kein Experte, aber dieser Befehl kann nichts bearbeiten ... das Schlimmste, was er tun kann, ist verwirrte Ergebnisse. Es ist jedoch eine andere Geschichte, wenn Sie RegExes von verschiedenen Benutzern ausführen. –

Antwort

12

Es gibt einen möglichen Angriff auf diesen Code namens ReDoS attack (Denial of Service des regulären Ausdrucks).

Der reguläre Ausdruck Denial of Service (REDOS) ist ein Denial-of-Service-Angriff, dass die Tatsache, dass die meisten Regular Expression Implementierungen erreichen können extreme Situationen nutzt, die sie verursachen nur sehr langsam arbeiten (exponentiell Eingangsgröße bezogen). Ein Angreifer kann dann ein Programm, das einen regulären Ausdruck verwendet, dazu veranlassen, in diese extremen Situationen einzutreten und sich dann sehr lange zu verhalten.

Insbesondere mit preg_match gibt es eine known issue, die eine PHP Segmentation Fault verursachen kann.

Also die Antwort ist nein, es ist nicht sicher wegen solcher Probleme.

+0

1. Mit ReDoS kann der Angreifer den Server nur verlangsamen, aber sonst keinen Schaden anrichten, oder? –

+0

2. PHP wird nicht "ausgehen", nachdem der Speicher der Anfrage das Speicherlimit überschritten hat? Was ich meine ist: Kann ich das Problem verhindern, indem ich das Speicherlimit reduziere und nicht zu viele Suchen auf einmal zulasse? –

+1

@SdgsdgAsgasgf: 1) Abgesehen davon, dass Ihr Server nicht auf alle Anfragen reagiert, nein. 2) There [kann ein Workaround für den Segfault sein] (http://php.net/manual/en/function.preg-match.php#88587). – SilverlightFox

4

Sicherheits weise sollten Sie nie Benutzereingaben vertrauen, so dass es abhängt, was Sie mit der Eingabe tun. In Ihrem Fall sollten Sie zumindest das verwendete Trennzeichen (Backslash) in der Benutzereingabe umgehen, um sicherzustellen, dass die Regex funktioniert.