web-dev-qa-db-ja.com

1つのドメインを除き、サイトからリンクをクリックしたときにリファラーを送信しないようにします

セキュリティ/プライバシー上の理由から、私はグローバルに referrer policy"no-referrer"に設定したいことを認めましょう。

たとえば、Apacheの.htaccess

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>

言い換えると、つまり、このポリシーをすべてのWebページにグローバルに適用することを望んでいます。

ただし、特定のドメイン(たとえばhttps://validator.w3.org/)については、リファラーを送信したい(たとえば、便利なurlhttps://validator.w3.org/check?uri=refererを使用したい)。

実験的な referrerpolicyリンクの属性 を使用できますが、その属性がどの程度サポートされているかわかりません。そのような属性がサーバーの設定をオーバーライドできるかどうかもわかりません。

link type 'norefferer'属性 十分にサポートされているようです 、しかし、私は反対を達成したいです!

特定のドメインを指すリンクを除き、リファラーの送信をグローバルに禁止するにはどうすればよいですか?

2
Clément

方法2

方法1(下記)の概念に従って、これはたった1つのテクノロジーで、現在のページをリロードせずに行うことができることに気付きました。それはすべてプレーンJavaScriptを使用してクライアント側で行われます。

<!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>

(このコードは間違いなく改善できます-それは単なる概念実証です。)

本質的にallowReferrer IDにはイベントリスナーがあり、トリガーされるとリンクがたどられず、リファラー= Originメタタグがヘッドに追加され、リンクをたどります。方法1よりもずっときれいです。

方法1

かなり複雑なソリューションをテストしたばかりですが、考えられる唯一のソリューションであり、うまくいきました。

<!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>

(このコードは間違いなく改善できます-それは単なる概念実証です。)

ページが読み込まれると、「refferer」というクエリパラメータが検索されます。「true」に設定されていない場合、リファラーメタタグは「no-refferer」に設定されますが、「true」に設定された場合、リファラーメタタグは「Origin」に設定され、javascriptが実行されて、「location」と呼ばれる2番目のクエリパラメータに保持されている場所にリダイレクトされます。

通常、すべてのリンクは、リファラー情報を渡さずにたどられます。リファラーが渡されることを許可するリンクが必要な場合は、次のようにリンクを作成します。

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

例えば

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

確かにきれいではありませんが、アンカータグのreferrerpolicy属性が適切にサポートされるまで、それが唯一の方法かもしれません。このソリューションを使用する前に、この機能を持っていることの重要性を自問することをお勧めします。

4
Josh