Dev.to Security πŸ” Cybersecurity πŸ‘ 0 πŸ“– 4 min read

Quick note: Middleware come Chain of Responsibility

Ogni anello decide se passare al successivo Lo stack middleware di Soft PHP MVC e una Chain of Responsibility: ogni middleware riceve la request, decide se gestirla o passarla al successivo, e puΓ² modificare la respons

Ogni anello decide se passare al successivo

Lo stack middleware di Soft PHP MVC e una Chain of Responsibility: ogni middleware riceve la request, decide se gestirla o passarla al successivo, e puΓ² modificare la response in uscita. CsrfMiddleware verifica il token β€” se manca, risponde 403 e la catena si interrompe. RateLimitMiddleware conta le richieste β€” se il limite e superato, risponde 429. AuthMiddleware verifica la sessione β€” se non autenticato, redirige al login. Ogni anello e un filtro autonomo con una logica precisa.

La potenza del pattern e nella composibilita: l'ordine dei middleware conta, ma ogni middleware e indipendente. Puoi aggiungere, rimuovere o riordinare anelli senza toccare gli altri. Il VisitorTrackingMiddleware e stato aggiunto alla catena senza modificare una riga dei middleware esistenti β€” e questo e il test definitivo di un buon Chain of Responsibility. L'Open/Closed Principle in azione: la catena e aperta all'estensione (nuovi anelli), chiusa alla modifica (anelli esistenti non cambiano).

Cos'e il Chain of Responsibility: definizione formale

Il Gang of Four definisce il Chain of Responsibility come un pattern comportamentale che "evita di accoppiare il mittente di una richiesta al suo destinatario, dando a piΓΉ oggetti la possibilita di gestire la richiesta. Gli oggetti riceventi vengono concatenati e la richiesta viene passata lungo la catena fino a quando un oggetto la gestisce". I due elementi chiave sono: l'Handler (l'interfaccia comune a tutti gli anelli) e la catena (la sequenza ordinata di handler).

A differenza dell'Observer, dove tutti gli osservatori vengono notificati, nella Chain of Responsibility la richiesta puΓ² fermarsi a qualsiasi anello. Un middleware che risponde con un errore 403 interrompe la catena β€” i middleware successivi non vengono eseguiti. Questa capacitΓ  di cortocircuito e fondamentale per la sicurezza: il CsrfMiddleware deve poter bloccare una richiesta malevola prima che raggiunga il controller.

L'anatomia di un middleware in Soft PHP MVC

Ogni middleware nel framework implementa un contratto semplice: riceve la request e un callable che rappresenta il prossimo anello della catena. Il middleware puΓ²:

  • Passare la request al successivo β€” chiama il callable e restituisce la response (middleware trasparente)
  • Modificare la request β€” aggiunge header, normalizza input, poi passa al successivo
  • Interrompere la catena β€” restituisce una response direttamente (errore, redirect, cache hit)
  • Modificare la response β€” chiama il successivo, poi modifica la response prima di restituirla

Questa flessibilita rende il middleware una primitiva estremamente potente. Non e un caso che la quasi totalita dei framework PHP moderni β€” Laravel, Symfony, Slim β€” adotti lo stesso pattern per il request handling. La Chain of Responsibility nel contesto HTTP e diventata uno standard de facto dell'ecosistema PHP.

Middleware concreti nel framework

Lo stack middleware di Soft PHP MVC include anelli con responsabilitΓ  diverse:

  • CsrfMiddleware β€” verifica il token CSRF su richieste POST/PUT/DELETE, protegge da attacchi cross-site request forgery
  • RateLimitMiddleware β€” limita le richieste per IP in una finestra temporale, previene abusi e DDoS
  • AuthMiddleware β€” verifica l'autenticazione, redirige al login se la sessione e scaduta
  • VisitorTrackingMiddleware β€” traccia i visitatori unici per analytics, senza bloccare la request
  • MaintenanceModeMiddleware β€” intercetta tutte le richieste e mostra la pagina di manutenzione quando attivo

L'ordine e significativo: il CSRF check avviene prima dell'auth, perchΓ© una richiesta senza token valido non dovrebbe nemmeno arrivare al controllo dell'autenticazione. Il rate limiting avviene prima di tutto, perchΓ© un attacco brute force non dovrebbe consumare risorse per verificare token o sessioni.

Pipeline pattern: l'evoluzione del Chain of Responsibility

In molti framework moderni, il Chain of Responsibility per i middleware e implementato come Pipeline: un oggetto che riceve una lista di handler e li esegue in sequenza, passando il risultato di uno come input del successivo. La Pipeline e una variante piΓΉ strutturata della catena classica β€” invece di lasciare che ogni anello conosca il successivo, la pipeline li orchestra dall'esterno.

In Soft PHP MVC, il kernel HTTP costruisce la pipeline al boot dell'applicazione, concatenando i middleware configurati nel file di routing. La pipeline e immutabile dopo la costruzione: l'ordine degli anelli non cambia durante l'esecuzione. Questa immutabilita semplifica il debugging e garantisce un comportamento predicibile β€” la stessa request attraversa sempre gli stessi anelli nello stesso ordine.

Quando usare la Chain of Responsibility

Il pattern e ideale quando:

  • PiΓΉ oggetti possono gestire una richiesta e il gestore corretto non e noto a priori
  • L'ordine di gestione e importante ma deve essere configurabile
  • Nuovi gestori devono poter essere aggiunti senza modificare quelli esistenti
  • Una richiesta deve poter essere rifiutata a qualsiasi livello della catena

Oltre ai middleware HTTP, la Chain of Responsibility si applica a validazione (ogni regola e un anello che puΓ² bloccare), logging (ogni handler decide se loggare e a quale livello), e event handling (ogni listener puΓ² marcare l'evento come gestito). In Soft PHP MVC, il middleware e l'applicazione principale, ma il pattern e una risorsa architetturale disponibile ogni volta che serve una catena decisionale configurabile e aperta all'estensione.

πŸ‘‰ Leggi l'articolo completo su iadicola.it

πŸ“° Read the original article on Dev.to Security

Originally published by Dev.to Security. Aggregated on AIWithGhost for educational purposes β€” full credit and traffic to the original publisher.