HttpServletRequest - Wie erhalte ich die verweisende URL?

144

Ich muss URLs, die mit meiner Site verknüpft sind, in einem Java-Servlet protokollieren.

Shane
quelle
Habe ich Sie richtig verstanden, dass Sie "google.com" angemeldet haben, wenn ich Ihre Website in Google gefunden und den Link geöffnet habe?
Roman

Antworten:

310

Es ist im HTTP- refererHeader verfügbar . Sie können es in einem Servlet wie folgt erhalten:

String referrer = request.getHeader("referer"); // Yes, with the legendary misspelling.

Sie müssen jedoch erkennen, dass dies ein vom Kunden kontrollierter Wert ist und somit auf etwas völlig anderes gefälscht oder sogar entfernt werden kann. Unabhängig vom zurückgegebenen Wert sollten Sie ihn daher nicht für kritische Geschäftsprozesse im Backend verwenden, sondern nur für die Präsentationssteuerung (z. B. Ausblenden / Anzeigen / Ändern bestimmter reiner Layoutteile) und / oder Statistiken.

Für Interessierte finden Sie Hintergrundinformationen zu Rechtschreibfehlern in Wikipedia .

BalusC
quelle
2
macht es einen Unterschied "Referer" & "Referer"?
ante.sabo
7
@ante: Nein, bei der Header-Suche wird die Groß- und Kleinschreibung nicht berücksichtigt.
BalusC
2
Beachten Sie, dass jeder Header sein kann null.
rds
@BalusC Was ist, wenn ich die beiden vorherigen URLs benötige? Es ist möglich ?
Angel Cuenca
26

Eigentlich ist es: request.getHeader("Referer")oder noch besser, und um 100% sicher zu sein request.getHeader(HttpHeaders.REFERER), wo HttpHeaders istcom.google.common.net.HttpHeaders

wpodgorski
quelle
11
Aus den Java EE API-Dokumenten für die Methode getHeader(String name)(Zitat):"The header name is case insensitive."
informatik01
7
Upvote trotzdem für HttpHeaders Referenz. Apache HTTP ist ein weiteres gutes:org.apache.http.HttpHeaders
Barett
16

Die URLs werden in der Anfrage übergeben : request.getRequestURL().

Wenn Sie andere Websites meinen, die auf Sie verlinken? Sie möchten den HTTP-Referrer erfassen, indem Sie Folgendes aufrufen:

request.getHeader("referer");
Chris K.
quelle
6

Wie alle schon erwähnt haben

request.getHeader("referer");

Ich möchte im Gegensatz zur akzeptierten Antwort einige weitere Details zum Sicherheitsaspekt des Referer- Headers hinzufügen . In OWASP- Spickzettel (Open Web Application Security Project ) wird unter CSRF-Präventions- Spickzettel ( Cross-Site Request Forgery) die Bedeutung des Referer- Headers erwähnt.

Noch wichtiger für diese empfohlene Überprüfung des gleichen Ursprungs ist, dass eine Reihe von HTTP-Anforderungsheadern nicht von JavaScript festgelegt werden können, da sie in der Liste der "verbotenen" Header aufgeführt sind. Nur die Browser selbst können Werte für diese Header festlegen, wodurch sie vertrauenswürdiger werden, da nicht einmal eine XSS-Sicherheitsanfälligkeit zum Ändern verwendet werden kann.

Die hier empfohlene Quellursprungsprüfung basiert auf drei dieser geschützten Header: Origin, Referer und Host, was sie zu einer ziemlich starken CSRF-Verteidigung für sich macht.

Sie können hier auf die Liste der verbotenen Header verweisen . Der Benutzeragent (dh der Browser) hat die volle Kontrolle über diese Header, nicht der Benutzer.

Don D.
quelle