Symfony hat in einem von Javier Eguiluz verfassten Beitrag vom 9. Oktober 2026 drei Sicherheitsänderungen vorgestellt, die mit der für November erwarteten Version 8.2 kommen. Alle drei betreffen die Komponente UriSigner, die für Passwort-Reset-Links, passwortlose Login-Links und E-Mail-Bestätigungslinks genutzt wird. Zusammen schließen sie Konstruktionsfehler, die viele PHP-Anwendungen reproduzieren, ohne es zu merken.
Einmal verwendbare Links dank Versionsparameter
Die Methoden sign(), check(), checkRequest() und verify() akzeptieren nun ein Argument $version, dessen Wert in die Signaturberechnung einfließt, ohne in der URL zu erscheinen. In der Praxis lässt sich ein Passwort-Reset-Link mit dem Hash des aktuellen Passworts signieren: Sobald das Passwort geändert wird, verifiziert der alte Link nicht mehr — selbst wenn er nie angeklickt wurde.
// Lors de l'envoi de l'email de réinitialisation
$url = $uriSigner->sign(
$this->generateUrl('reset_password', ['id' => $user->getId()], UrlGeneratorInterface::ABSOLUTE_URL),
new \DateInterval('PT30M'),
$user->getPassword(),
);
// Dans le contrôleur qui traite le lien
$uriSigner->verify($request, $user->getPassword());
Ablaufzeit wird in 9.0 verpflichtend
Eine URL ohne Ablaufdatum zu signieren, gilt nun als veraltet; Symfony 9.0 macht diese Ablaufzeit verpflichtend. Zwei Möglichkeiten, sie festzulegen: bei jedem Aufruf von sign() übergeben, oder einen Standardwert über die Konfiguration des Diensts uri_signer setzen:
framework:
uri_signer:
expiration: 3600
| Änderung | Status in 8.2 | Status in 9.0 |
|---|---|---|
Argument $version (Einmalnutzung) | Verfügbar | Unverändert |
| Ablaufzeit signierter URLs | Veraltet ohne Ablaufzeit | Verpflichtend |
| Signierte Login-Link-Parameter | Verfügbar über $parameters | Unverändert |
Login-Links lassen keine Parameter mehr offen
Dritte Änderung: zusätzliche Query-Parameter eines Login-Links (etwa ein Weiterleitungsziel) waren bislang nicht von der Signatur abgedeckt und ließen sich daher ändern, ohne den Link ungültig zu machen. createLoginLink() akzeptiert nun ein Argument $parameters, das zusammen mit dem Rest der URL signiert wird:
$loginLinkDetails = $loginLinkHandler->createLoginLink($user, parameters: [
'return_to' => '/account/settings',
]);
Der Beitrag weist auf ein leicht zu übersehendes Detail hin: Im Erfolgs-Handler für die Anmeldung muss das Weiterleitungsziel aus dem Attribut _login_link_parameters gelesen werden, niemals aus dem rohen Query-String. Ein E-Mail-Client oder ein Tracking-Tool kann eigene, unsignierte Parameter an die URL anhängen; nur die über dieses Attribut gelesenen wurden tatsächlich geprüft.
Ein Reset-Link, der nach Gebrauch gültig bleibt oder kein Ablaufdatum trägt, ist keine vergessene Funktion — er ist ein Konstruktionsfehler, den Symfony nun endlich an der Wurzel behebt.
Eine Korrektur, die über den Framework-Kern hinausreicht
Diese drei Änderungen kommen kurz nach der Komponente KeyManagement, die in derselben Version 8.2 eingeführt wurde und die Verschlüsselung sensibler Daten hinter den wichtigsten KMS-Anbietern des Markts vereinheitlicht. Die Absicherung signierter URLs folgt derselben Logik: Entwicklern Entscheidungen aus der Hand zu nehmen, die, dem Standard überlassen, am Ende zu Schwachstellen werden. Anwendungen, die einen eigenen Generator für signierte Links statt UriSigner verwenden, profitieren von keiner dieser Korrekturen und bleiben denselben Mängeln ausgesetzt; eine Prüfung an dieser Stelle ergänzt sinnvoll eine breitere Überprüfung der Sicherheitsrichtlinie der Anwendung.
Was man sich merken sollte
Symfony 8.2, erwartet für November, führt einmal verwendbare signierte Links ein, bereitet die für Version 9.0 vorgesehene Pflicht-Ablaufzeit vor und signiert nun die Parameter von Login-Links. Alle drei Korrekturen zielen auf verbreitete Konstruktionsfehler bei Passwort-Reset- und passwortlosen Login-Links.
In Code-Audits bei Kunden finde ich regelmäßig Passwort-Reset-Links, die weit über ihre erste Nutzung hinaus gültig bleiben, weil eine explizite Invalidierung auf Anwendungsseite fehlt. Diese Korrektur nimmt Entwicklern genau diese Verantwortung ab: Sobald eine Anwendung auf Symfony 8.2 aktualisiert, gibt es keinen Grund mehr, für diesen Fall einen selbstgebauten UriSigner-Workaround zu pflegen — Simon Janvier.
Zum Weiterlesen: der offizielle Beitrag im Symfony-Blog.
