HttpServletRequest - comment obtenir l'URL de référence?

144

Je dois enregistrer les URL qui renvoient à mon site dans un servlet Java.

Shane
la source
Ai-je bien compris que si j'ai trouvé votre site dans google et ouvert le lien, vous vous êtes connecté à «google.com»?
Roman

Réponses:

311

Il est disponible dans l' en- referertête HTTP . Vous pouvez l'obtenir dans un servlet comme suit:

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

Cependant, vous devez vous rendre compte qu'il s'agit d'une valeur contrôlée par le client et qu'elle peut donc être usurpée en quelque chose d'entièrement différent ou même supprimée. Ainsi, quelle que soit la valeur renvoyée, vous ne devez pas l'utiliser pour des processus métier critiques dans le backend, mais uniquement pour le contrôle de la présentation (par exemple, masquer / afficher / modifier certaines parties de la mise en page pure) et / ou des statistiques.

Pour les intéressés, des informations sur la faute d'orthographe peuvent être trouvées sur Wikipedia .

BalusC
la source
2
cela fait-il une différence "référent" et "référent"?
ante.sabo
7
@ante: non, la recherche d'en-tête est insensible à la casse.
BalusC
2
Notez que n'importe quel en-tête peut être null.
rds
@BalusC Et si j'ai besoin des deux URL précédentes? C'est possible ?
Angel Cuenca
26

En fait, c'est :, request.getHeader("Referer")ou même mieux, et pour être sûr à 100% request.getHeader(HttpHeaders.REFERER), où se trouve HttpHeaderscom.google.common.net.HttpHeaders

wpodgorski
la source
11
Extrait de la documentation de l'API Java EE pour la méthode getHeader(String name)(citation):"The header name is case insensitive."
informatik01
7
upvote quand même pour la référence HttpHeaders. Apache HTTP est un autre bon:org.apache.http.HttpHeaders
Barett
16

Les URL sont transmis dans la demande: request.getRequestURL().

Si vous parlez d'autres sites qui vous renvoient? Vous souhaitez capturer le référent HTTP, ce que vous pouvez faire en appelant:

request.getHeader("referer");
Chris K
la source
6

Comme tous l'ont mentionné, c'est

request.getHeader("referer");

Je voudrais ajouter quelques détails supplémentaires sur l'aspect de sécurité de l'en- tête du référent par opposition à la réponse acceptée. Dans les feuilles de triche du projet Open Web Application Security ( OWASP ), sous la feuille de triche de prévention de la falsification des demandes intersites (CSRF), il mentionne l'importance de l'en- tête du référent .

Plus important encore, pour cette vérification recommandée de la même origine, un certain nombre d'en-têtes de requête HTTP ne peuvent pas être définis par JavaScript car ils figurent dans la liste des en-têtes «interdits». Seuls les navigateurs eux-mêmes peuvent définir des valeurs pour ces en-têtes, ce qui les rend plus fiables car même une vulnérabilité XSS ne peut être utilisée pour les modifier.

La vérification de l'origine de la source recommandée ici repose sur trois de ces en-têtes protégés: Origin, Referer et Host, ce qui en fait une défense CSRF assez solide à elle seule.

Vous pouvez consulter la liste des en-têtes interdits ici . L'agent utilisateur (c'est-à-dire le navigateur) a le contrôle total sur ces en-têtes et non sur l'utilisateur.

Don D
la source