web-dev-qa-db-fra.com

Jouer avec l'en-tête Referer

Il existe 2 sites:

http://www.site1.com
http://www.site2.com

http://www.site1.com contient un lien vers http://www.site2.com as

<a href="http://www.site2.com/">link<a/>

Lorsque l'utilisateur clique sur le lien de http://www.site1.com le navigateur envoie l'en-tête Referer à http://www.site2.com. Basé sur l'en-tête du référent http://www.site2.com effectue certains processus.

Je me demande si je peux simuler/changer (peut-être avec javascript, PHP, ...) En-tête de référent ou ne pas l'envoyer du tout?

16
torayeff

Il existe deux situations dans lesquelles vous souhaitez contrôler l'en-tête Referer. Soit dit en passant, Referer est une faute d'orthographe du mot "referrer".

Si vous souhaitez contrôler votre navigateur personnel pour ne pas passer le Referer à site2.com, vous pouvez le faire avec de nombreuses extensions de navigateur:

L'autre situation est celle où vous êtes un webmaster et vous voulez que les utilisateurs de votre site (site1.com) pour ne pas envoyer le Referer à d'autres sites liés sur votre site. Vous pouvez le faire de plusieurs manières:

  • Utilisez SSL/TLS (https) sur votre site et une fonctionnalité de sécurité du navigateur n'est pas de transmettre les liens Refererto HTTP sur vos pages servies avec SSL/TLS. Cependant, si les liens sur vos pages utilisent HTTPS, Referer sera toujours ignoré, sauf s'il est explicitement désactivé par d'autres moyens décrits ci-dessous.
  • Utilisez le HTML5 rel="noreferrer" attribut. Il est pris en charge par tous les principaux navigateurs.
  • Utilisez une URL de données ('data:') pour masquer la page réelle d'où provient le lien: <a href='data:text/html;charset=utf-8, <html><meta http-equiv="refresh" content="0;URL=&#39;http://site2.com/&#39;"></html>'>Link text</a>.
  • Masquez le Referer en redirigeant vers une page intermédiaire. Ce type de redirection est souvent utilisé pour empêcher les liens potentiellement malveillants d'obtenir des informations à l'aide de Referer, par exemple un ID de session dans la chaîne de requête. De nombreux sites Web de grande communauté utilisent la redirection de liens sur des liens externes pour réduire les chances d'un exploit qui pourrait être utilisé pour voler des informations de compte, ainsi que pour indiquer clairement lorsqu'un utilisateur quitte un service, pour réduire les chances de phishing efficace.

Voici un exemple de redirection simpliste en PHP:

<?php
$url = htmlspecialchars($_GET['url']);
header( 'Refresh: 0; url=http://'.$url );
?>
<html>
 <head>
  <title>Redirecting...</title>
  <meta http-equiv="refresh" content="0;url=http://<?php echo $url; ?>">
 </head>
 <body>
 Attempting to redirect to <a href="http://<?php echo $url; ?>">http://<?php echo $url; ?></a>.
 </body>
</html>
30
Cristian Dobre

À partir de 2015, voici comment vous empêchez votre site Web d'envoyer l'en-tête Referer:

Ajoutez simplement ceci à la section principale de la page Web:

 <meta name="referrer" content="no-referrer" />

Cela fonctionne aussi bien pour les liens que pour les requêtes Ajax faites par du code JavaScript sur la page.

Les autres options meta valides incluent:

<meta name="referrer" content="unsafe-url" />
<meta name="referrer" content="Origin" />
<meta name="referrer" content="no-referrer-when-downgrade" />
<meta name="referrer" content="Origin-when-cross-Origin" />

• Voir si cela fonctionne pour votre navigateur ici: http://caniuse.com/#feat=referrer-policy

• Voir les spécifications ici: http://w3c.github.io/webappsec/specs/referrer-policy/

Remarque: Si vous souhaitez supprimer le référent en utilisant uniquement JavaScript, je pense que vous pouvez ajouter dynamiquement la balise META appropriée juste avant de faire la demande Ajax. Je n'ai cependant pas testé cela.

Notez également que les navigateurs envoient désormais l'en-tête Origin qui comprend le domaine et le port et, pour autant que je sache, ne peut pas être supprimé. Si tu utilises <meta name="referrer" content="Origin" /> le référent contiendra des informations similaires à l'en-tête Origin, ce qui est déjà bon du point de vue de la confidentialité, car il masquera la page exacte dans laquelle se trouve l'utilisateur.

9
MarcG

Vous ne pouvez pas modifier l'en-tête du référent à moins de contrôler le client appelant, par ex. le navigateur.

Les navigateurs bloquent la modification du référent, et le code côté serveur ne peut pas injecter d'en-têtes dans une demande car il n'y a aucun moyen d'obtenir l'en-tête du serveur au client, et de faire en sorte que le client l'injecte dans l'en-tête du référent de sa prochaine demande.

Cela suppose que le navigateur ne présente pas de vulnérabilité particulière concernant l'injection d'en-tête à partir de JavaScript.

4
Steve

J'écrirais un script python (voir http://docs.python-requests.org/en/latest/ pour une grande bibliothèque, si l'urllib standard semble compliqué), mais je pense que vous seriez en mesure d'usurper le référent en utilisant le plug-in d'en-tête http Tamper data/live pour firefox. Pas sûr, mais jetez un œil. referer dans les addons firefox.

0
xeet

Un excellent aperçu du problème de référence et de son histoire peut être trouvé dans "Dépouiller le référent pour le plaisir et le profit" .

Le même article contient également d'excellents liens vers:

  1. Pour les paresseux parmi nous, le service de redirection referer.us URL et, mieux encore,
  2. A script côté client indépendant du navigateur , utilisant le génial <iframe src=about:blank> tour.
0
Serge Stroobandt

Il n'est pas difficile de créer un en-tête HTTP.

Vous avez seulement besoin d'un terminal et de couteau suisse comme netcat (C'est un outil qui vous permet de faire des choses très basiques, comme cat sur le réseau).

Quelque chose comme:

nc << eof www.site2.com 80
GET /somepath/somedest HTTP/1.0
Host: wwww.site2.com
Referer: wwww.site1.com

.
eof

Ça pourrait suffire.

(Remarque: le point . à la fin est inutile, mais une ligne vide marque la fin de l'en-tête)

Donc, la réponse est oui il est possible de simuler un en-tête HTTP.

Cela a été fait sur firefox 19.0

Pour masquer le champ référent, j'ai utilisé une option dans le serveur proxy squid il y a quelques années, mais je suis sûr qu'il doit exister des modules ou des extensions pour un navigateur qui ferait l'affaire ...

... Un rapide coup d'œil dans ma configuration firefox (v19.0) me permet de voir qu'il y a une option: network.http.sendRefererHeader.

Cette option peut être définie sur:

  • 0 N'envoyez jamais l'en-tête Referer ou définissez document.referrer.
  • 1 Envoyez l'en-tête Referer lorsque vous cliquez sur un lien et définissez document.referrer pour la page suivante.
  • 2 (Par défaut) Envoyez l'en-tête Referer lorsque vous cliquez sur un lien ou chargez une image, et définissez document.referrer pour la page suivante.
0
F. Hauri