Regulární výraz může vypadat nevinně, projít všemi běžnými testy a přesto na jednom pečlivě zvoleném vstupu spotřebovat sekundy nebo minuty procesoru. Katastrofický backtracking vzniká v backtracking enginech, když vzor dovoluje mnoho způsobů rozdělení stejného textu a selže až téměř na konci. Engine pak zkouší možnosti jednu po druhé. Z lokálního detailu validace se může stát výkonová chyba nebo veřejně zneužitelný denial of service.

Normální backtracking pomáhá flexibilnímu hledání

Chamtivý kvantifikátor nejprve spotřebuje maximum. Když následující token nemůže pokračovat, engine vrátí část znaků a zkusí kratší variantu. Díky tomu může obecnější část najít správnou hranici před příponou. Samotné vracení tedy není chyba, ale běžný mechanismus.

Riziko vzniká, když několik sousedních nebo vnořených částí může spotřebovat tytéž znaky. Každý neúspěch otevírá další větve: méně mohl vzít vnější kvantifikátor, vnitřní opakování nebo jiná alternativa. Počet kombinací pak neroste lineárně s délkou vstupu.

Klasickým varováním je vnořená nejednoznačnost

Vzor podobný (a+)+ je problematický, protože vnitřní i vnější plus mohou rozdělit sérii písmen mnoha způsoby. Pokud výraz na konci očekává znak, který nepřijde, engine může před odmítnutím prozkoumat téměř všechny oddíly. Úspěšný krátký vstup vysokou cenu skryje.

Produkční výrazy nebývají tak nápadné. Stejnou strukturu vytvoří opakovaná skupina s volitelnými mezerami, širokým wildcardem nebo překrývajícími se alternativami. Review musí hledat nejednoznačnost spotřeby, ne pouze známý učebnicový zápis.

Volby mají být vzájemně odlišitelné

Rychlý regex nechává enginu málo rozhodnutí. Třída, která se zastaví před oddělovačem, je jasnější než opakovaná tečka následovaná stejným oddělovačem. Alternativy by měly pokud možno začínat rozdílně a kvantifikátory mají používat reálné horní limity domény.

Atomic groups a possessive quantifiers v podporovaných enginech zakazují vracení znaků. Mají však vyjadřovat skutečné pravidlo, že jednou přijatá část se už nesmí zkrátit. Nejsou univerzální dekorací, která automaticky opraví chybný význam výrazu.

Velikost vstupu se omezuje před matchingem

Ani dobře navržená validace nemá přijímat nekonečná data. Pokud uživatelské jméno dovoluje nejvýše 64 znaků, delší hodnotu lze odmítnout před spuštěním složitého vzoru. Limit chrání nejen regex, ale také proxy, parser, logy a úložiště.

Při zpracování dokumentů nebo logů je často vhodnější postupovat po řádcích či streamu než použít jeden výraz nad celým souborem. Menší jednotky snižují výkonové riziko i možnost, že obecný token nechtěně přeskočí několik záznamů.

Testují se hlavně téměř správné neúspěchy

Patologické chování se často skrývá v řetězci se správným dlouhým prefixem a chybným posledním znakem. Sada má obsahovat opakované oddělovače, chybějící ukončení, prázdné volitelné sekce a délky blízko limitu. Je užitečné sledovat, jak čas roste s velikostí; nelineární křivka je varování i tehdy, když malé příklady stále končí rychle.

Časové testy potřebují toleranci pro různá prostředí, ale mohou hlídat praktický strop. Statické analyzátory a fuzzing navíc pomohou najít kombinace, na které autor při ručním návrhu nepomyslel.

Vlastnosti závisí na konkrétním enginu

Ne každý regex engine používá neomezený backtracking. Některé zaručují lineární čas tím, že nepodporují konstrukce vyžadující širší hledání. Jiné nabízejí backreference, lookaround a bohatší syntax, ale mohou vykazovat patologické chování. Bezpečný vzor na jedné platformě nemusí mít stejný profil na jiné.

Upgrade frameworku může změnit engine, Unicode pravidla nebo výchozí limit. Důležité výrazy proto potřebují behaviorální i výkonové testy ve skutečném runtime, nikoli pouze dokumentovaný zdrojový zápis.

ReDoS je riziko celé aplikace

Pokud nedůvěryhodný vstup dosáhne zranitelného vzoru, útočník může malým počtem requestů zaměstnat workery nebo event loop. Atraktivní jsou veřejné endpointy přihlášení, vyhledávání, routingu a validace. Rate limit pomáhá, ale jediný extrémně drahý request může stále způsobit významný dopad.

Obrana kombinuje jednoznačný vzor, limit dat, timeout tam, kde jej platforma nabízí, a izolaci skutečně náročného zpracování. Výkon regexu je forma validace spotřeby zdrojů, nikoli pouze otázka stylu.

Timeout omezuje škodu, ale neopravuje návrh

Některé platformy dovolují match po určité době přerušit. To je cenná další vrstva, protože jeden vstup nezablokuje pracovní proces navždy. Timeout má vést ke kontrolovanému selhání a telemetrii, nikoli k automatickému opakování stejné operace.

Časté timeouty dokazují problém ve vzoru, limitu nebo zvoleném enginu. Přerušení neudělá nejednoznačný výraz efektivním a nemá nahrazovat jeho úpravu.

Produkce potřebuje pozorovatelnost bez úniku dat

Testy mají používat realistické délky a rozložení znaků. Produkční monitoring může zaznamenat nezvykle pomalé shody a spojit je se jménem pravidla, aniž by ukládal citlivý vstup. Změna upstream dat totiž může odhalit nejednoznačnost, které se původní příklady nikdy nedotkly.

Při incidentu pomůže rozlišit čas samotného matchingu od fronty a dalšího zpracování. Metrika délky vstupu, verze pravidla a počet timeoutů ukáže, zda problém přinesla nová data nebo nasazená změna. Dočasné omezení endpointu může snížit dopad, ale oprava musí odstranit nejednoznačnou cestu. Po incidentu má vzniknout regresní test s bezpečně anonymizovaným tvarem vstupu a měřitelným výkonovým limitem.

Takový praktický limit se kontroluje při každé další produkční i bezpečnostní úpravě vzoru.

Nejspolehlivější vzor má zřejmou cestu a jasné hranice. Pokud vysvětlení, proč se vnořená opakování nepřekrývají, vyžaduje dlouhý důkaz, je rozumnější výraz zjednodušit nebo použít parser. Katastrofický backtracking je řešitelný, když tým testuje nepříznivé neúspěchy a bere regex jako spustitelný kód na hranici systému.