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_parameterse 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.
Altri articoli recenti
Laravel AI 1.1 e 1.2: Agent Skills, Cohere e structured output più solidi
Le release 1.1.0 e 1.2.0 di laravel/ai portano gli Agent Skills, l'approvazione obbligatoria per i tool built-in e nuovi provider come Cohere e Laya self-hosted. Sul fronte qualità arrivano i fix allo structured output per Bedrock e il supporto alle provider options. Aggiornati anche i modelli di default, con Claude 4.7+ che ignora i sampling params.
Laravel 13.35.0: scheduler più controllabile, code più flessibili e response Markdown
Laravel 13.35.0 porta Schedule::alwaysOnOneServer(), il supporto a schedule:interrupt per i comandi di lunga durata, --memory in percentuale per queue:work e il nuovo metodo markdown() sulla response factory. Tante piccole migliorie anche a test, view compilate in parallelo e dischi local.
BashBox: un interprete Bash in sandbox per agenti AI in PHP
BashBox è un interprete bash scritto in puro PHP che permette di eseguire gli script generati dagli agenti AI senza mai ricorrere a proc_open, exec o shell_exec. Ogni comando è una classe PHP che lavora su un filesystem virtuale, con limiti di esecuzione, quote disco e accesso di rete configurabili. Ideale per chi sviluppa agenti con il Laravel AI SDK o altre librerie simili.