Ich bin mir nicht sicher, ob dies ein Fehler in Spring 5.0.3 oder eine neue Funktion ist, mit der ich Probleme beheben kann.
Nach dem Upgrade wird dieser Fehler angezeigt. Interessanterweise ist dieser Fehler nur auf meinem lokalen Computer. Der gleiche Code in der Testumgebung mit dem HTTPS-Protokoll funktioniert einwandfrei.
Auch weiterhin...
Der Grund, warum ich diesen Fehler erhalte, ist, dass meine URL zum Laden der resultierenden JSP-Seite lautet /location/thisPage.jsp
. Das Auswerten des Codes request.getRequestURI()
gibt mir ein Ergebnis /WEB-INF/somelocation//location/thisPage.jsp
. Wenn ich die URL der JSP-Seite darauf korrigiere location/thisPage.jsp
, funktionieren die Dinge einwandfrei.
Meine Frage ist also, ob ich im Code /
aus dem JSP
Pfad entfernen soll, da dies in Zukunft erforderlich ist. Oder Spring
hat einen Fehler eingeführt, da der einzige Unterschied zwischen meinem Computer und der Testumgebung das Protokoll im HTTP
Vergleich zum Protokoll ist HTTPS
.
org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL was not normalized.
at org.springframework.security.web.firewall.StrictHttpFirewall.getFirewalledRequest(StrictHttpFirewall.java:123)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:194)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:357)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:270)
quelle
Antworten:
In der Spring-Sicherheitsdokumentation wird der Grund für das Blockieren // in der Anforderung angegeben.
Es gibt also zwei mögliche Lösungen -
Schritt 1 Erstellen Sie eine benutzerdefinierte Firewall, die einen Schrägstrich in der URL ermöglicht.
Schritt 2 Konfigurieren Sie diese Bean anschließend in Websecurity
Schritt 2 ist ein optionaler Schritt. Spring Boot benötigt lediglich eine Bean vom Typ
HttpFirewall
quelle
setAllowUrlEncodedSlash(true)
hat bei mir nicht funktioniert. Noch interne MethodeisNormalized
Rückkehrfalse
, wenn ein doppelter Schrägstrich mit.I ersetzt
StrictHttpFirewall
mitDefaultHttpFirewall
nur den folgenden Code aufweist:Arbeitet gut für mich.
Irgendein Risiko durch die Verwendung
DefaultHttpFirewall
?quelle
StrictHttpFirewall
, um etwas mehr Kontrolle über die Ablehnung von URLs zu erhalten, wie in dieser Antwort beschrieben .<sec:http-firewall ref="defaultHttpFirewall"/>
Ich bin auf dasselbe Problem gestoßen mit:
Das Problem trat an den Endpunkten auf, an denen der
ModelAndView
Ansichtsname mit einem vorhergehenden Schrägstrich definiert wurde . Beispiel:Wenn ich den Schrägstrich entfernt habe, hat es gut funktioniert. Beispiel:
Ich habe auch einige Tests mit RedirectView durchgeführt und es schien mit einem vorhergehenden Schrägstrich zu funktionieren.
quelle
Sobald ich beim Aufrufen der API einen doppelten Schrägstrich verwendet habe, wurde der gleiche Fehler angezeigt.
Ich musste http: // localhost: 8080 / getSomething aufrufen, aber ich mochte http: // localhost: 8080 // getSomething . Ich habe es behoben, indem ich zusätzlichen Schrägstrich entfernt habe.
quelle
In meinem Fall wurde das Upgrade von spring-securiy-web 3.1.3 auf 4.2.12 standardmäßig
defaultHttpFirewall
vonDefaultHttpFirewall
auf geändertStrictHttpFirewall
. Definieren Sie es einfach in der XML-Konfiguration wie folgt:einstellen
HTTPFirewall
alsDefaultHttpFirewall
quelle
Die folgende Lösung ist eine saubere Lösung. Sie beeinträchtigt nicht die Sicherheit, da wir dieselbe strenge Firewall verwenden.
Die Schritte zur Befestigung sind wie folgt:
SCHRITT 1: Erstellen Sie eine Klasse, die die StrictHttpFirewall wie folgt überschreibt .
SCHRITT 2: Erstellen Sie eine FirewalledResponse- Klasse
SCHRITT 3: Erstellen Sie einen benutzerdefinierten Filter, um die RejectedException zu unterdrücken
SCHRITT 4: Fügen Sie den benutzerdefinierten Filter in der Sicherheitskonfiguration zur Federfilterkette hinzu
Jetzt mit der obigen Korrektur können wir
RequestRejectedException
mit Fehler 404 Seite behandeln.quelle
In meinem Fall wurde das Problem dadurch verursacht, dass ich nicht mit Postman angemeldet war. Daher habe ich in einem anderen Tab eine Verbindung mit einem Sitzungscookie geöffnet, den ich aus den Headern meiner Chrome-Sitzung entnommen habe.
quelle