Скрытие Referer-а

Discussion in 'PHP' started by scanislav, 4 Jun 2013.

  1. scanislav

    scanislav Elder - Старейшина

    Joined:
    25 Jun 2010
    Messages:
    87
    Likes Received:
    22
    Reputations:
    31
    Неувядающая тема. Казалось бы просто: как перейти по ссылке илм открыть iframe так, чтоб хозяин сайта не знал, кто на него ссылается? Ссылаемся, например, на Брайана Кребса, но не хотим, чтоб тот проведал, как мы о нем сплетничаем. :D Законное желание!

    Оказывается, что способов много, но ни один не дает 100% гарантии

    Метод HTML5
    Использовать атрибут rel=noreferrer (да. с двумя r в середине, в отличие от заголовка Referer)

    HTML:
    <a href="http://krebsonsecurity.com/" rel="noreferrer">Ссылка</a>
    Способ замечательный, одобренный всеми комитетами по стандартам, только реализованный исключительно в WebKit (то есть в браузерах Chrome и Safari). Остальные браузеры атрибут rel игнорируют.

    Метод комбинированый, почти универсальный
    Является сочетанием нескольких методов - не один, так другой сработает.

    HTML:
    <iframe src="javascript:d=document;d.clear();d.open();d.write(&quot;&lt;html&gt;&lt;head&gt;&lt;meta http-equiv=Refresh content='0; URL=http://krebsonsecurity.com/'&gt;&lt;/head&gt;&lt;body&gt;&lt;/body&gt;&lt;/html&gt;&quot;);d.close();">
    
    По шагам:
    1. Создаем Iframe c адресом, состоящим из выполняемого джаваскрипта. Это действие создает новый пустой документ и запускает код в контексте созданного документа.

    2. Джаваскрипт очищает документ и пишет в него новый HTML-код:
    HTML:
    <html>
    <head>
    <meta http-equiv=Refresh content="0; URL=http://krebsonsecurity.com">
    </head>
    <body>
    </body>
    </html>
    
    3. Тэг meta выполняет редирект на нужную страницу.

    Шаги можно немного варьировать, например, использовать URL типа data: вместо javascript: , но данная версия покрывает, по опыту, максимальное количество браузеров.

    Если требуется не iframe а простая ссылка, то придется писать так:
    HTML:
    <script>
    function goto(url) {
      var w = window.open();
      var d = w.document();
      d.write("<meta http-equiv='Refresh' content='0; URL=" +
        url + "'>" );
      w.close();
      return false;
    }
    </script>
    <a href="http://krebsonsecutity.com" onclick="goto(this.href)">Ссылка</a>
    
    Отказывается подчиняться только Opera, других исключений я не нашел (Замечу, что ачат использует очень похожий метод для анонимизации ссылок - и в Опере он тоже не работает. Будте бдительны!)

    Специально же для Оперы был придуман

    Метод Закладок
    Вот так:
    HTML:
    <a href='data:application/internet-shortcut,[INTERNETSHORTCUT]%0D%0AURL=http://krebsonsecurity.com/'>Ссылка</a>
    
    (Спасибо юзеру AntoIIIka за инфу)

    Работает прием исключительно в Опере, остальные браузеры либо вообще не понимают, либо пытаются сохранить файл на диск.

    ...И наконец есть

    Метод HTTPS

    Согласно стандарту RFC2616,
    Это значит, что если мы придем со страницы типа https:// на адрес типа http:// то Referer не передастся. Проще всего вынести редирект на отдельную страницу.

    http://site.com:
    HTML:
    <a href="https://site.com/redirect.php?r=http://krebsonsecurity.com">Ссылка</a>
    
    https://site.com/redirect.php
    Code:
    <html>
    <head>
    <meta http-equiv=Refresh content='0; URL=<?php echo htmlspecialchars(@$_GET['r']); ?>'>
    </head>
    <body>
    </body>
    </html>
    
    Метод самый железобетонный, работает во всех браузерах, которые я проверял, даже в Опере. Недостатков два:

    Трудоемкость - надо сделать SSL сертификат, настроить веб-сервер, добавить аутентификацию (если мы не хотим, чтоб нашим редиректором пользовался кто попало) итп. Но если один раз поднял редиректор, то дальше можно спокойно пользоваться.

    Не работает с адресами типа https: - Про переход с https на https стандарт молчит. К счастью, сайтов, куда можно попасть исключительно через https довольно мало (ну некоторые форумы приватные, но зачем же на них ссылаться? :D )

    Как-то так.