On the Complexity of the Matching Problem of Regular Expressions with Backreferences
Questo lavoro stabilisce la complessità computazionale fine-granulare della corrispondenza di espressioni regolari con backreference dimostrando limiti inferiori condizionati sotto le ipotesi SETH e di rilevamento dei triangoli, presentando al contempo un algoritmo migliorato per i backreference a singolo utilizzo.
Articolo originale sotto licenza CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/). Questa è una spiegazione generata dall'IA dell'articolo qui sotto. Non è stata scritta né approvata dagli autori. Per precisione tecnica, consulta l'articolo originale. Leggi il disclaimer completo
Il Quadro Generale: L'Ingorgo del "Regex"
Immagina di essere una guardia di sicurezza in un club (il sistema informatico). Hai una lista di regole (un'espressione Regolare) per determinare chi può entrare.
- Regole Semplici: "Solo persone che indossano camicie rosse". Questo è facile da verificare. Guardi una camicia, dici "Rosso? Sì, entra". Ci vuole lo stesso tempo sia che la fila sia di 10 persone che di 10.000.
- Il Problema (ReDoS): A volte, gli hacker creano una fila specifica di persone che inganna la guardia facendole svolgere una quantità enorme di lavoro inutile. Invece di controllare una persona e passare oltre, la guardia inizia a controllare la Persona A, poi la Persona B, poi di nuovo la Persona A, poi la Persona C, poi di nuovo la Persona A... finché la guardia non collassa per esaurimento. Questo è chiamato attacco di Denial of Service (ReDoS).
Nel mondo reale, questo ha causato il blocco di siti web massicci come Stack Overflow e Cloudflare. Il documento nota che anche una lentezza "quadratica" (dove controllare 100 persone richiede 10.000 passaggi) è sufficiente per far crollare un sistema.
Il Cattivo: I "Backreference"
Le regole standard sono semplici. Ma i motori "Regex" moderni hanno una funzione super potente chiamata Backreference.
L'Analogia:
Immagina una regola che dice: "Trova una parola, ricordala, e poi assicurati che la stessa identica parola appaia di nuovo più tardi".
- Esempio: "Trova una parola, chiamala 'X'. Poi, trova di nuovo 'X'".
- Se l'input è
mela ... mela, funziona. - Se l'input è
mela ... banana, fallisce.
Questa funzione è incredibilmente utile per i programmatori, ma rende il lavoro della guardia molto più difficile. La guardia deve ricordare cosa ha visto prima e confrontarlo costantemente con ciò che sta vedendo ora. Il documento chiede: Possiamo costruire una guardia abbastanza veloce da gestire queste regole complesse senza stancarsi?
Le Scoperte del Documento: Il Buono, Il Cattivo e Il Brutto
Gli autori hanno indagato esattamente quanto sia difficile risolvere questi problemi di corrispondenza. Li hanno suddivisi in due aspetti: Difficoltà (Perché è difficile) e Algoritmi (Come risolverlo).
1. La Cattiva Notizia: Alcune Regole sono Impossibili da Accelerare
Il documento dimostra che per certi tipi di regole complesse, non esiste una "bacchetta magica" per renderle veloci.
- Il Problema del "Triangolo": Hanno mostrato che se hai una regola che usa due variabili (come ricordare due parole diverse e controllarle più tardi), risolverla è difficile quanto trovare un triangolo in un gigantesco grafo di rete sociale. Se potessi risolvere la regola rapidamente, potresti risolvere il problema del grafo rapidamente. Poiché gli esperti di grafi credono che il problema del grafo sia intrinsecamente lento, anche il problema della regola deve essere lento.
- Il Problema dei "Vettori Ortogonali": Per regole con ancora più variabili, hanno dimostrato che il tempo richiesto cresce esponenzialmente con il numero di variabili. È come cercare una combinazione specifica di chiavi in una serratura; più chiavi hai, più diventa impossibile forzare la soluzione rapidamente.
Conclusione: Se la tua regola è troppo complessa (usa molte funzioni "ricorda questo"), non puoi costruire un motore veloce per essa. Ci sarai sempre un muro.
2. La Buona Notizia: Una Soluzione "Quasi Lineare" per Casi Semplici
Tuttavia, il documento ha trovato un punto dolce. Si sono concentrati su un tipo specifico e comune di regola:
- Il Pattern "ABCBD": "Trova una parola (A), poi una parola (B), poi una parola (C), poi la stessa identica parola B di nuovo, poi una parola (D)".
- Esempio reale: "Trova un nome utente, poi una password, poi un messaggio, poi lo stesso nome utente di nuovo, poi una firma".
Gli autori hanno scoperto che, sebbene questo sembri complicato, può essere risolto in modo molto efficiente.
- Il Vecchio Modo: I metodi precedenti erano come controllare ogni possibile combinazione in una biblioteca, richiedendo un tempo (quadratico). Se il libro aveva 1.000 pagine, richiedeva 1.000.000 di passaggi.
- Il Nuovo Modo: Gli autori hanno costruito un nuovo algoritmo che richiede circa tempo.
- L'Analogia: Immagina che la biblioteca sia organizzata con un sistema di indicizzazione magico (utilizzando Alberi dei Suffix e Foreste di Fattorizzazione). Invece di leggere ogni pagina, la guardia può saltare direttamente alle sezioni pertinenti. Se il libro ha 1.000 pagine, il nuovo metodo richiede circa 10.000 passaggi (o anche meno), il che è un miglioramento enorme.
Come Funziona il Nuovo Algoritmo (I "Trucchi Magici")
Per raggiungere questa velocità, gli autori hanno utilizzato diverse tecniche astute, descritte nel documento:
- L'Albero dei Suffix (La Mappa): Hanno costruito una gigantesca mappa della stringa di input. Questa mappa mostra ogni possibile fine della stringa. Aiuta la guardia a vedere istantaneamente: "Oh, questa parola 'B' appare qui, e appare anche lì".
- Decomposizione Pesante-Leggera (Il Cappello Parlante): Hanno diviso la mappa in percorsi "pesanti" (percorsi molto comuni) e percorsi "leggeri" (percorsi rari). Svolgono il lavoro pesante solo sui percorsi rari, risparmiando tempo.
- Periodicità (Il Ritmo): Hanno notato che quando una parola si ripete (come "B...B"), la stringa spesso ha un ritmo o un pattern. Hanno usato la matematica per prevedere questi pattern invece di controllare ogni singola lettera.
- Foreste di Fattorizzazione (L'Indice): Questa è una struttura dati che agisce come un indice super veloce, permettendo alla guardia di verificare se un blocco di testo corrisponde a una regola in tempo costante, indipendentemente dalla lunghezza del testo.
Riepilogo della Conclusione
- Possiamo fermare tutti gli attacchi ReDoS? No. Se una regola è troppo complessa (troppe variabili "ricorda questo"), è matematicamente provato che è lenta.
- Possiamo risolvere le regole complesse più comuni? Sì! Per il caso specifico in cui una regola ricorda una parola e la controlla una volta più tardi (il pattern "ABCBD"), gli autori hanno creato un nuovo motore che è quasi veloce quanto le regole semplici.
- Perché è importante? Dice agli ingegneri del software: "Non usate troppi backreference, o sarete lenti. Ma se li usate in questo modo specifico e comune, ora potete usare il nostro nuovo metodo per mantenere il vostro sistema sicuro e veloce".
Il documento traccia essenzialmente una linea nella sabbia: Ecco dove il limite di velocità è infrangibile, ed ecco dove abbiamo trovato un modo per guidare più velocemente.
Sommerso dagli articoli nel tuo campo?
Ricevi digest giornalieri degli articoli più recenti corrispondenti alle tue parole chiave di ricerca — con riassunti tecnici, nella tua lingua.