Verarbeitung der CSRF-Überprüfung der Spring Security 6.0-Version

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-TOKENdas Token aus dem Feld abrufen und es dann in X-XSRF-TOKENdas 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-TOKENauch 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 CsrfFilterdieser Klasse und führen Sie sie im Debug-Modus aus, um festzustellen , dass der Abgleich nicht erfolgreich ist.doFilterInternalactualToken null

String actualToken = this.requestHandler.resolveCsrfTokenValue(request, csrfToken);

was requestHandlerdefiniert 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 getTokenValuediese Methode der Schuldige. Dies ist eine statische Methode. Ehrlich gesagt verstehe ich nicht, was sie schreibt.

Aber wir haben festgestellt, dass XorCsrfTokenRequestAttributeHandlerdiese Klasse eine übergeordnete Klasse hat CsrfTokenRequestAttributeHandler, keine überschreibende resolveCsrfTokenValueMethode und eine Konstruktionsmethode ohne Argumente, also einfach direkt eine neue, um die ursprüngliche Definition zu überschreiben.

おすすめ

転載: blog.csdn.net/hjg719/article/details/128290380