Inhaltsverzeichnis
Problembeschreibung
Vor Version 6 (Starter-3-Version) können wir die CSRF-Überprüfung einfach über den folgenden Code aktivieren und das Token über Cookie an das Frontend bereitstellen
http.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
;
Standardmäßig kann das Frontend XSRF-TOKEN
das Token aus dem Feld abrufen und es dann in X-XSRF-TOKEN
das Feld im Anforderungsheader werfen
Nach Version 6 werden Sie feststellen, dass, wenn Sie es einfach auf diese Weise öffnen, es gemäß der vorherigen Anforderungsmethode abgefangen wird und 302 zur Anmeldeschnittstelle wechselt. Zu diesem Zeitpunkt gibt es Felder im Cookie, und das gibt es XSRF-TOKEN
auch auch ein Absatz auf der 302-Webseite
<input name="_csrf" type="hidden" value="xsAQ1pzqT6wQB6SZxE8QXANbvNNXV483n1xCBpbhmQKqRRO_p_J04avffM89Y5SgoWIkPTE4kbFgZLoa_G91ZKXQrDuddCeH" />
Der auf der Webseite ist der echte Token und der im Cookie ist ungültig.
Lösung
Ändern Sie den obigen Aktivierungscode in
http.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.csrfTokenRequestHandler(new CsrfTokenRequestAttributeHandler())
;
Fehlersuche
Die CSRF-Überprüfung liegt in der Verantwortung der Klasse. Überprüfen Sie die Methode CsrfFilter
dieser Klasse und führen Sie sie im Debug-Modus aus, um festzustellen , dass der Abgleich nicht erfolgreich ist.doFilterInternal
actualToken
null
String actualToken = this.requestHandler.resolveCsrfTokenValue(request, csrfToken);
was requestHandler
definiert ist als
private CsrfTokenRequestHandler requestHandler = new XorCsrfTokenRequestAttributeHandler();
Sehen Sie sich die Implementierung dieser Methode an
@Override
public String resolveCsrfTokenValue(HttpServletRequest request, CsrfToken csrfToken) {
String actualToken = super.resolveCsrfTokenValue(request, csrfToken);
return getTokenValue(actualToken, csrfToken.getToken());
}
Beim Ausführen im Debug-Modus wird festgestellt, dass die Methode hier actualToken
einen Wert hat, nachdem die Methode der übergeordneten Klasse ausgeführt wurde. Dann ist getTokenValue
diese Methode der Schuldige. Dies ist eine statische Methode. Ehrlich gesagt verstehe ich nicht, was sie schreibt.
Aber wir haben festgestellt, dass XorCsrfTokenRequestAttributeHandler
diese Klasse eine übergeordnete Klasse hat CsrfTokenRequestAttributeHandler
, keine überschreibende resolveCsrfTokenValue
Methode und eine Konstruktionsmethode ohne Argumente, also einfach direkt eine neue, um die ursprüngliche Definition zu überschreiben.