notiziephp.it

Novità in Symfony 8.2: URL firmati monouso e più sicuri (Symfony Blog)

Traduzione da Symfony Blog
9 Ottobre 2026 Tempo di lettura: 3 minuti
Novità in Symfony 8.2: URL firmati monouso e più sicuri (Symfony Blog)

Gli URL firmati ti permettono di condividere link che non possono essere manomessi, come i link per il reset della password, i link di conferma email o i link di download. Symfony fornisce l'utility UriSigner per crearli e verificarli, e i login link per autenticare gli utenti senza password. Symfony 8.2 rende entrambi più sicuri e flessibili.

Un URL firmato resta valido fino alla sua scadenza, indipendentemente da quante volte venga utilizzato. Questo è un problema per link come quelli di reset della password, che dovrebbero smettere di funzionare una volta svolto il loro compito. Finora dovevi implementare una tua logica di invalidazione per questi link (ad esempio salvando un token nel database).

In Symfony 8.2, i metodi sign(), check(), checkRequest() e verify() di UriSigner accettano un nuovo argomento $version. Il suo valore viene aggiunto alla firma (ma non all'URL), quindi l'URL è valido solo finché quel valore rimane invariato. Usa un valore che cambia una volta utilizzato il link, come l'hash della password dell'utente:

Chiamare verify() non invalida il link. Il link diventa non valido nel momento in cui l'applicazione salva il nuovo hash della password dell'utente. Qualsiasi chiamata successiva a verify() con quell'hash genera una UnverifiedSignedUriException.

Lo stesso principio vale per altri link: usa la data dell'ultimo accesso per i login link o la data di verifica dell'email per i link di conferma email.

Gli URL firmati senza scadenza sono validi per sempre, quindi un link che finisce in una vecchia email o in un file di log può essere usato in qualsiasi momento. Per questo Symfony 8.2 depreca la chiamata a UriSigner::sign() senza scadenza. In Symfony 9.0 la scadenza sarà obbligatoria.

Puoi passare la scadenza in ogni chiamata a sign() oppure definirne una predefinita tramite il nuovo argomento del costruttore $defaultExpiration (un \DateInterval o un numero di secondi). Se usi il servizio uri_signer del framework, imposta la scadenza predefinita (in secondi) con la nuova opzione uri_signer.expiration:

I login link contengono l'identificativo dell'utente, la data di scadenza e una firma. Se aggiungevi altri parametri di query a questi link (ad esempio la pagina verso cui reindirizzare dopo il login), chiunque poteva modificarli perché non erano firmati.

In Symfony 8.2, il metodo createLoginLink() accetta un nuovo argomento $parameters. Questi parametri vengono aggiunti all'URL del link e coperti dalla sua firma:

Se qualcuno modifica o rimuove uno di questi parametri, il login link diventa non valido. Quando il link viene utilizzato, Symfony memorizza i parametri verificati nell'attributo di richiesta _login_link_parameters:

Attenzione

Nel tuo authentication success handler, leggi sempre questi valori dall'attributo _login_link_parameters e non dalla query string. Symfony ignora i parametri di query extra che non sono firmati (ad esempio i parametri di tracciamento aggiunti dai client di posta), quindi chiunque può aggiungerli all'URL.

Condividi su: LinkedIn

Altri articoli recenti