Es gibt keine Möglichkeit REDOS auszulösen auf (a+)+
, ([a-zA-Z]+)*
, (a|aa)+
, (a|a?)+
, da gibt es nichts, das Spiel Scheitern und Auslöser Rückzieher nach dem problematischen Teil der Regex verursachen kann.
Wenn Sie die Regex etwas ändern, zum Beispiel adding b$
after each of the regex above, dann können Sie katastrophal Rückzieher auslösen mit einem Eingang wie aaa
... aabaa
... aa
.
Abhängig von der Implementierung und Optimierung der Engine gibt es Fälle, in denen wir ein katastrophales Backtracking erwarten, aber der Motor zeigt kein Anzeichen für ein solches Verhalten.
Zum Beispiel gegeben (a+)+b
und den Eingang aaa
... aac
, PCRE fails the match outright, da sie eine Optimierung hat, dass das Spiel der richtigen vor dem Start für gewünschte Zeichen in der Eingabezeichenfolge überprüft.
Wissen, was der Motor tut, können wir throw off its early detection mit dem Eingang aaa
... aacb
und bekommen den Motor zu katastrophalen Backtracking zeigen.
Was (.*a){x}
ist es möglich, REDOS auszulösen, da es eine fehlerhafte Bedingung weniger als x
Iterationen hat. Wenn die Eingabezeichenfolge aaa
... a
(mit x
oder mehr des Zeichens a
) eingegeben wird, versucht die Regex alle Permutationen von a
am Ende der Zeichenfolge, wenn sie vom Ende der Zeichenfolge zurückverfolgt. Daher ist die Komplexität der Regex O (2 x). Wenn wir das wissen, können wir sagen, dass der Effekt besser sichtbar ist, wenn x
eine größere Nummer ist, let's say 20. Übrigens ist dies ein seltener Fall, bei dem eine übereinstimmende Zeichenfolge die Worst-Case-Komplexität aufweist.
Wenn Sie die Beispiele direkt von OWASP kopiert haben, warum nicht den Rest dieser Seite lesen? Was ist der praktische Anwendungsfall für diese Frage? Warum nicht weniger dumme Regexps verwenden? – mario
Povoke Sie sagten? 'ini_set ('pcre.backtrack_limit', 1);' Um das Standardlimit zu erreichen, benötigt man einen großen '$ Eingang', einen, der eine Grenze von 100000 Bytes überschreitet. Und trotzdem ist dies kein DoS-Angriff, da die Funktion einfach nichts zurückgibt und eine Benachrichtigung ausgelöst wird. – Xorifelse
Ich tat dies, aber es hat nicht funktioniert @ Xorifelse – user126623