web-dev-qa-db-fra.com

Empêcher l'envoi de référents lorsque vous cliquez sur les liens de mon site avec une exception pour un domaine

Admettons que, pour des raisons de sécurité/confidentialité, je souhaite définir globalement ma règle de référence sur "no-referrer".

Par exemple, en utilisant les .htaccess de Apache

Header always set Referrer-Policy no-referrer

IIS 'web.config'

<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Referrer-Policy" value="no-referrer" />
             </customHeaders>
        </httpProtocol>
    </system.webServer>
</configuration>

etc., etc. En d'autres termes, je souhaite que cette politique soit appliquée globalement, pour chaque page Web.

Cependant, pour un domaine particulier (par exemple https://validator.w3.org/), j'aimerais envoyer le référant (par exemple, pour utiliser le pratique urlhttps://validator.w3.org/check?uri=referer).

Je pourrais utiliser le test expérimental referrerpolicy attribut of links , mais je ne sais pas dans quelle mesure cet attribut est pris en charge. Je ne sais pas non plus si un tel attribut peut annuler le paramétrage du serveur.

L'attribut link type 'norefferer'semble bien pris en charge , mais je veux obtenir le contraire!

Comment pourrais-je globalement refuser l'envoi du référant, à l'exception des liens pointant vers un domaine particulier?

2
Clément

Méthode 2

En suivant le concept de la méthode 1 (ci-dessous), j'ai réalisé que cela pourrait probablement être fait avec une seule technologie et sans recharger la page en cours. Tout est fait côté client avec du javascript simple.

<!DOCTYPE html>
<head>
</head>
<body>
    <a href="https://validator.w3.org" id="allowReferrer">Link that you do want to allow referrer to be passed to</a>
    <a href="http://w3.org">Link that you don't want referrer to be passed to</a>

    <script>
    document.getElementById('allowReferrer').addEventListener('click', function(e){
        e.preventDefault();
        var metaRef = document.createElement("meta");
        metaRef.setAttribute("name", "referrer");
        metaRef.setAttribute("content", "Origin");
        document.head.appendChild(metaRef);
        window.location.href=this.href;
    });
    </script>
</body>
</html>

(Ce code peut certainement être amélioré - c'est juste une preuve de concept.)

Esentiellement, il y a un écouteur d’événements sur l’ID allowReferrer qui, une fois déclenché, empêche le lien de suivre, ajoute la balise méta référent = origine à l’en-tête, puis suit le lien. Beaucoup plus ordonné que la méthode 1.

Méthode 1

Je viens de tester une solution un peu compliquée, mais c'est la seule solution à laquelle je puisse penser, et cela a fonctionné.

<!DOCTYPE html>
<head>
    <?php
    if ($_GET["referrer"] == "true") {
        echo '<meta name="referrer" content="Origin">';
        echo '<script>window.location.href = "'.$_GET["location"].'";</script>';
    } else {
        echo '<meta name="referrer" content="no-referrer">';
    }
    ?>
</head>
<body>
    <a href="http://example.com/?referrer=true&location=https%3A%2F%2Fvalidator.w3.org">Link that you do want to allow referrer to be passed to</a>
    <a href="http://google.com">Link that you don't want referrer to be passed to</a>
</body>
</html>

(Ce code peut certainement être amélioré - c'est juste une preuve de concept.)

Lors du chargement de la page, elle recherche un paramètre de requête appelé 'refferer'. S'il n'est pas défini sur "true", la balise méta du référent est définie sur "no-refferer", mais si elle est définie sur "true", le référent La balise méta est définie sur 'Origine' et javascript est exécuté pour vous rediriger vers un emplacement stocké dans le deuxième paramètre de requête appelé 'emplacement'.

Tous les liens seront normalement suivis sans passer aucune information sur le référent. Si vous souhaitez qu'un lien permette au référent d'être transmis, vous devez alors créer votre lien en tant que

[current URL]?referrer=true&location=[link which should be url encoded]

par exemple

http://example.com/test/some-page.php?referrer=true&location=https%3A%2F%2Fvalidator.w3.org

Ce n'est certainement pas joli, mais tant que l'attribut referrerpolicy n'est pas pris en charge sur les balises d'ancrage, il s'agit peut-être du seul moyen. Avant d’utiliser cette solution, je vous prie de vous demander à quel point il est important que vous disposiez de cette fonctionnalité et en vaut-il la peine?

4
Josh