web-dev-qa-db-fra.com

Quel est le moyen le plus fiable de cacher/usurper le parrain en JavaScript?

Normalement, le référent est traçable via:

  • document.referrer de JavaScript
  • Les en-têtes de requête, par exemple $_SERVER['HTTP_REFERER'] de PHP

J'ai mis en place un DÉMO DU CODEPAD qui affiche ces propriétés à des fins de test.

Exigences:

  1. Le référent d'origine doit effectivement être masqué, du moins pour tous les événements de souris.
  2. Prise en charge multi-navigateur (au moins Chrome et Firefox).
  3. Autonome, sans contenu externe (plugins, bibliothèques, pages de redirection, ...).
  4. Pas d'effets secondaires: les liens ne doivent pas être réécrits pas, les entrées d'historique doivent être préservées.

La solution sera utilisée pour masquer le référent lorsque vous suivez un lien de <a href="url">.


Description exacte du cas d'utilisation

Comme décrit dans cette question sur Webapps , les liens de Google Search sont modifiés en un clic. Par conséquent,

  1. Google est capable de suivre votre comportement de recherche (Confidentialité--)
  2. La demande de page est légèrement retardée.
  3. La page liée ne peut pas suivre votre requête de recherche Google (Privacy ++)
  4. Les URL glissées/copiées ressemblent à http://google.com/lotsoftrash?url=actualurl.

Je développe un script utilisateur (Firefox)/contenu) (Chrome) ( code _), qui supprime l’événement de mutilation de liens de Google. En conséquence, les points 1, 2 et 4 sont traités.

Le point 3 reste.

  • Chrome: <a rel="noreferrer">
  • Firefox: data-URIs . J'ai créé une approche sophistiquée pour implémenter cette fonctionnalité pour les clics gauche et moyen, tout en maintenant le point 4. Cependant, je me bats avec la méthode du clic droit.
40
Rob W

Mes trésors sont un plaisir de jouer dans Chrome et Firefox. Ho a mis en oeuvre son code utilisateur,Non rintracciami Google.

Démo (test sur Firefox 9 et Chrome 17):http://jsfiddle.net/RxHw5/

Masquage du référent par Webkit (Chrome, ..) et Firefox 37+ (33 + *)

Navigateur bas sur Webkit (Chrome, Safari) supporto<a rel="noreferrer"> spec .
Il nascondimento dei refererrer può essere completamente implémenter une combinaison des questions/réponses avec votre auditoire:

  • mousedown- Al clic, clic central, goût de la souris sur le menu de lecture rapide, ...
  • keydown(TabTabTab...Enter).

Codice:

function hideRefer(e) {
   var a = e.target;
   // The following line is used to deal with nested elements,
   //  such as: <a href="."> Stack <em>Overflow</em> </a>.
   if (a && a.tagName !== 'A') a = a.parentNode;
   if (a && a.tagName === 'A') {
      a.rel = 'noreferrer';
   }
}
window.addEventListener('mousedown', hideRefer, true);
window.addEventListener('keydown', hideRefer, true);

* rel=noreferrer est pris en charge dans Firefox à partir de la version 33, ce qui correspond au nombre limite de pages dans la page. Je referenci venivano ancora inviati quand l'utre aprivo est déjà programmé sur le menu de lecture rapide. Questo bug est mis à jour dans Firefox 37[ bug 1031264 ].

Référence si vous êtes intéressé par la version de Firefox

Firefox non supportava rel="noreferrer" fina alla versione 33 `[ bug 530396 ](o 37, se si desidera nascondere il référent anche pour i menu di scelta rapida).

Vous pouvez également utiliser une URI de données + <meta http-equiv=refresh> par nom de référence dans Firefox (et IE). L'implémentation de questions-réponses est plus compliquée, mais rien ne se passe comme prévu:

  • click- Tout clic, en un clic du milieu,Enter
  • contextmenu- Pour en savoir plus sur la souris,TabTab...Contextmenu

Dans Firefox, l'évènement click est en cours de création pour mouseup e che colpisceEntersu un lien (ou control del modulo). L'evento contextmenu è obbligatorio, poiché l'evento click si attiva troppo tardi par question.

Voir les informations sur le délai d'attente avant de quitter:
Quando viene attivato l'evento click, l'attributo href viene temporaneamente sostituito avec un URI di dati. L'événement est terminé et a confirmé son comportement: Définition de la date, date de début et de la fin target et modification du MAJ/CTRL.
Nel frattempo, l'attributo href viene ripristinato allo stato originale.

Quand il s’agit d’attaquer l’événement contextmenu, il fait le lien entre cambia et une deuxième fraise.

  • The opzioni Open Link in ... apriranno l'URI dei dati.
  • L'opzione Copy Link location fa riferimento all'URI originale ripristinato.
  • L'opzione Bookmark fa riferimento all'URI dei dati.
  • Save Link as punta all'URI dei dati.

Codice:

// Create a data-URI, redirection by <meta http-equiv=refresh content="0;url=..">
function doNotTrack(url) {
   // As short as possible. " can potentially break the <meta content> attribute,
   // # breaks the data-URI. So, escape both characters.
   var url = url.replace(/"/g,'%22').replace(/#/g,'%23');
   // In case the server does not respond, or if one wants to bookmark the page,
   //  also include an anchor. Strictly, only <meta ... > is needed.
   url = '<title>Redirect</title>'
       + '<a href="' +url+ '" style="color:blue">' +url+ '</a>'
       + '<meta http-equiv=refresh content="0;url=' +url+ '">';
   return 'data:text/html,' + url;
}
function hideRefer(e) {
   var a = e.target;
   if (a && a.tagName !== 'A') a = a.parentNode;
   if (a && a.tagName === 'A') {
      if (e.type == 'contextmenu' || e.button < 2) {
         var realHref = a.href; // Remember original URI
         // Replaces href attribute with data-URI
         a.href = doNotTrack(a.href);
         // Restore the URI, as soon as possible
         setTimeout(function() {a.href = realHref;}, 4);
      }
   }
}
document.addEventListener('click', hideRefer, true);
document.addEventListener('contextmenu', hideRefer, true);

Combinando entrambi i metodi

Cliquez sur le lien suivant pour afficher le modèle. Cliquez sur le lien suivant pour afficher le modèle. Quindi puoi selezionare le code pertinent bas navigator.userAgent (cioè UA-reniflant), en utilisant des méthodes de travail complétées Venez-vous en savoir plus? .

40
Rob W

Ne pouvez-vous pas créer un système de liaison qui réside dans les iframes?

Si vous enroulez un iframe autour de chaque lien, l’iframe peut servir de référence externe. L'utilisateur clique sur le lien à l'intérieur du cadre, ouvrant une page dont le référent est défini sur l'emplacement de l'iFrame au lieu de la page réelle.

10
fmsf

Comme demandé, en utilisant JavaScript:

var meta = document.createElement('meta');
meta.name = "referrer";
meta.content = "no-referrer";
document.getElementsByTagName('head')[0].appendChild(meta);

Cela ajoutera la balise méta suivante à la section head de la page Web:

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

À partir de 2015 , voici comment vous empêchez l'envoi de l'en-tête Referer.

6
MarcG

Il existe une solution multi-navigateur en Javascript qui supprime le référent, elle utilise des iframes créés dynamiquement, vous pouvez jeter un oeil à un preuve de concept (disclaimer: il utilise un peu de la bibliothèque JS que j'ai écrite).

3
jpgerek

Vous pouvez utiliser le nouveau projet de norme Politique de renvoi pour éviter que l’en-tête du référent ne soit envoyé à la demande Origine. Exemple:

<meta name="referrer" content="none">

Bien que Chrome et Firefox aient déjà implémenté une version préliminaire de la stratégie de référencement, vous devez être prudent car par exemple, Chrome attend no-referrer au lieu de none (et j'ai également vu never quelque part). Je ne connais pas le comportement si vous ajoutez seulement trois balises méta distinctes, mais si cela ne fonctionne pas, vous pouvez toujours mettre en œuvre un court script qui itère sur les trois valeurs et vérifie si la valeur a été définie après l'attribut/propriété de la balise meta.

Cette balise META s’applique à toutes les demandes de la page actuelle (ajax, images, scripts, autres ressources, etc.) et à la navigation vers une autre page.

3
Joel Richard

Ce que vous demandez ne peut pas être fait dans Firefox.

L'implémentation du menu contextuel current passe toujours le document actuel en tant que référent:

// Open linked-to URL in a new window.
openLink: function () {
    var doc = this.target.ownerDocument;
    urlSecurityCheck(this.linkURL, doc.nodePrincipal);
    openLinkIn(this.linkURL, "window", {
        charset: doc.characterSet,
        referrerURI: doc.documentURIObject // <----------------
    });
},

// Open linked-to URL in a new tab.
openLinkInTab: function () {
    var doc = this.target.ownerDocument;
    urlSecurityCheck(this.linkURL, doc.nodePrincipal);
    openLinkIn(this.linkURL, "tab", {
        charset: doc.characterSet,
        referrerURI: doc.documentURIObject // <----------------
    });
},

// open URL in current tab
openLinkInCurrent: function () {
    var doc = this.target.ownerDocument;
    urlSecurityCheck(this.linkURL, doc.nodePrincipal);
    openLinkIn(this.linkURL, "current", {
        charset: doc.characterSet,
        referrerURI: doc.documentURIObject // <----------------
    });
}, 

De toute évidence, les scripts utilisateur ne sont pas autorisés à modifier l’implémentation du menu contextuel. Le seul moyen de sortir est donc une extension de navigateur.

(Ou, ce qui constituerait un hack assez pauvre, désactivez le menu contextuel en appelant preventDefault() dans l'événement contextmenu et utilisez votre propre menu contextuel personnalisé)

1
user123444555621

C'est plus compliqué qu'il n'y paraît à première vue. Regardez le code de ce projet:

https://github.com/knu/noreferrer

Il promet tout à fait ce que vous voulez, mais vous devez le faire sur la page de liens.

1
Boldewyn

Une analyse très complète (mais brève) peut être trouvée à:

http://lincolnloop.com/blog/2012/jun/27/referrer-blocking-hard/

cet article analyse les deux méthodes expliquées dans d'autres réponses (méthode js, iframe redirecting) et suggère enfin une approche de page de redirection par médiateur, comme celle présentée dans les liens de recherche Google.

1
Amir Ali Akbari

J'ai implémenté une solution iframe simple mais efficace en utilisant jquery.

https://jsfiddle.net/skibulk/0oebphet/

(function($){
  var f = $('<iframe src="about:blank" style="display: none !important;">').appendTo('body');
  $('a[rel~=noreferrer]').click(function(event){
    var a = $(event.target.outerHTML);
    a.appendTo(f.contents().find('body'));
    a[0].click();
    return false;
  });
})(jQuery);
0
skibulk