Quel est le moyen le plus fiable de cacher / mystifier la référence dans JavaScript?

Normalement, le referrer est traçable à travers:

  • JavaScript document.referrer
  • les en-têtes de requête, p.ex. $_SERVER['HTTP_REFERER'] "1519100920 de PHP"

j'ai mis en place un codepad demo qui montre ces propriétés, à des fins d'essai.

exigences:

  1. la référence originale devrait effectivement, être caché, au moins pour tous les événements de la souris.
  2. prise en charge par plusieurs navigateurs (au moins Chrome et Firefox).

  3. autonome, sans aucun contenu externe (plugins, bibliothèques, pages de redirection, ...).
  4. pas d'effets secondaires: les liens ne doivent pas être réécrits, les entrées historiques doivent être préservé .

la solution sera utilisé pour masquer le référent en suivant un lien de <a href="url"> .


description exacte de l'utilisation

comme décrit dans cette question sur Webapps , liens à Google Search sont modifiés sur Cliquer. En conséquence,

  1. Google est en mesure de suivre votre comportement de recherche (de la vie privée-- )
  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 (Confidentialité++ )
  4. les URL traînées/copiées ressemblent à http://google.com/lotsoftrash?url=actualurl .

je développe un Userscript (Firefox) / Content script (Chrome) ( code ) , qui supprime L'événement de mutilation de lien de Google. En conséquence, les points 1, 2 et 4 sont traitées.

reste le Point 3.

  • Chrome: <a rel="noreferrer">
  • Firefox: data-URIs . J'ai créé une approche sophistiquée pour implémenter cette fonctionnalité pour les clics de gauche et du milieu, tout en appliquant le point 4. cependant, je suis aux prises avec la méthode du clic droit.
40
demandé sur Community 2012-01-17 14:45:10

10 réponses

j'ai trouvé une solution qui fonctionne dans Chrome et Firefox. J'ai implémenté le code dans un Userscript, ne me suivez pas sur Google .

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

referrer cacher pour Webkit (Chrome,..) et Firefox 37+ (33+*)

les navigateurs Webkit (tels que comme Chrome, Safari) prise en charge <a rel="noreferrer"> spec .

La masquage de la référence peut être entièrement implémentée en combinant cette méthode avec deux écouteurs d'événements:

  • mousedown - sur le click, le milieu-click, droit-click contextmenu,...
  • keydown ( Tab Onglet Onglet ... entrer ).

Code:

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 depuis 33, mais le soutien est limité à la page des liens. Les référents étaient encore envoyés lorsque l'utilisateur ouvrait l'onglet via le menu contextuel. Ce bug a été corrigé dans Firefox 37 [ bug 1031264 ] .

Référent de la clandestinité pour les anciennes versions de Firefox

Firefox n'a pas supporté rel="noreferrer" jusqu'à la version 33 ` [ bug 530396 ] (ou 37, Si vous souhaitez cacher le referrer pour les menus de contexte aussi bien).

un URI + <meta http-equiv=refresh> peut être utilisé pour cacher le referrer dans Firefox (et IE). La mise en œuvre de cette fonctionnalité est plus compliquée, mais nécessite également deux événements:

  • click - Sur un clic, sur le clic du milieu, Entrez

  • contextmenu - Sur clic-droit, Onglet Onglet ... Contextmenu

dans Firefox, l'événement click est allumé pour chaque mouseup et frapper Entrez sur un lien (ou le contrôle de forme). L'événement contextmenu est requis, parce que l'événement click se déclenche trop tard pour ce cas.

basé sur les données-URIs et split-second time-outs:

Lorsque l'événement click est déclenché, l'attribut href est temporairement remplacé par un URI de données. L'événement terminé, et le comportement par défaut se produit: Ouverture de L'URI de données, dépendant de l'attribut target et SHIFT/CTRL modificateur.

Pendant ce temps, l'attribut href est restauré à son état d'origine.

lorsque l'événement contextmenu est déclenché, le lien change également pour une fraction de seconde.

  • les options Open Link in ... ouvriront L'URI de données.
  • l'option Copy Link location fait référence à L'URI original restauré.
  • ñ l'option Bookmark fait référence à L'URI de données.
  • п Save Link as pointe vers L'URI de données.

Code:

// 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);

combinaison des deux méthodes

malheureusement, il n'y a pas de moyen simple de détecter cette fonctionnalité (et encore moins de tenir compte des bogues). Ainsi, vous pouvez soit sélectionner le code approprié basé sur navigator.userAgent (i.e. UA-sniffing), ou utiliser l'une des méthodes de détection alambiquée de Comment puis-je détecter rel="noreferrer" soutien? .

40
répondu Rob W 2017-05-23 10:31:00

ne pouvez-vous pas créer un système de liens qui réside dans iframes?

Si vous enchaînez un iframe autour de chaque lien, l'iframe peut agir comme un externe de référence. L'utilisateur cliquerait sur le lien à l'intérieur du cadre, en ouvrant une page dont le referrer est réglé à l'emplacement de l'iFrame, au lieu de la page réelle.

10
répondu fmsf 2012-01-25 16:23:49

comme demandé, en utilisant JavaScript:

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

ceci ajoutera la balise meta suivante à la section head de la page web:

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

à partir de 2015 c'est ainsi que vous empêchez l'envoi de L'en-tête Referer.

6
répondu MarcG 2015-08-15 20:08:39

il y a une solution de navigateur croisé dans Javascript qui supprime le referrer, il utilise Iframes créé dynamiquement, vous pouvez jeter un oeil à un preuve de concept (disclaimer: il utilise une petite bibliothèque JS j'ai écrit ).

3
répondu jpgerek 2012-10-05 11:28:02

vous pouvez utiliser le nouveau Referrer Policy standard draft pour empêcher que l'en-tête du referer soit envoyé à l'origine de la requête. Exemple:

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

bien que Chrome et Firefox aient déjà mis en œuvre un projet de version de la Politique de Referrer, vous devriez faire attention car par exemple Chrome attend no-referrer au lieu de none (et j'ai aussi vu never quelque part). Je ne connais pas le comportement si vous ajoutez trois balises meta séparées, mais dans le cas où cela ne fonctionne pas, vous pouvez tout de même implémenter un script court qui itère sur les trois valeurs et vérifie si la valeur a été réellement définie après avoir défini l'attribut/propriété de la balise meta.

cette balise meta s'applique à toutes les requêtes de la page courante (ajax, images, scripts, autres ressources...) et de la navigation vers une autre page.

3
répondu Joel Richard 2015-03-03 15:59:56

C'est plus compliqué qu'il ne 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 lien.

1
répondu Boldewyn 2012-01-17 11:17:43

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

Le contexte actuel de menu mise en œuvre 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 // <----------------
    });
}, 

évidemment, userscripts ne sont pas autorisés à changer l'implémentation du menu contextuel, donc la seule solution est une extension du navigateur.

(Ou, ce qui serait une assez mauvaise hack, désactiver le menu contextuel en appelant preventDefault() sur le contextmenu de l'événement, et d'utiliser votre propre menu contextuel personnalisé)

1
répondu user123444555621 2012-01-20 13:25:14

Un très complet (mais court) analyse peut être trouvé à:

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, redirection iframe) et suggère enfin une approche de page médiate redirector, comme celui vu dans les liens de recherche google.

1
répondu Amir Ali Akbari 2012-08-26 14:13:37

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
répondu skibulk 2016-05-02 20:08:25

que faire si nous soumettons un formulaire en utilisant JavaScript, de cette façon il n'y aura pas de referrer.

document.form_name.submit()

Fondamentalement, nous sommes soumettre un formulaire avec la méthode désirée ACTION .

-2
répondu highwingers 2014-03-28 07:00:36