Запрещение другим веб-сайтам видеть «правильного» реферера - PullRequest
3 голосов
/ 11 декабря 2011

На моем сайте пользователи могут размещать материалы анонимно.

Когда они опубликовали что-то, они будут перенаправлены на их пост, скажем:

http://example.com/post/2/title-of-the-anonymous-post

Пользователь, предоставивший сообщение, и администраторы - единственные, кто имеет доступ к этому сообщению (пока оно не будет опубликовано). Как только оно будет обнародовано, сообщение будет анонимным (то есть люди не смогут увидеть, кто отправил сообщение).

Однако на этой странице также есть некоторые внешние ссылки. Если пользователь решит щелкнуть по внешней ссылке, целевой веб-сайт сможет войти в систему http referer (который будет содержать ссылку на скрытую страницу). Это означает, что можно будет узнать, кто его опубликовал, как только он будет опубликован.

Есть ли способ изменить HTTP реферер (/ referrer), когда пользователь нажимает на ссылку на другой сайт?

Например, сначала перенаправив пользователя на другой URL-адрес и разрешив перенаправить эту страницу на внешний веб-сайт:

пользователь нажимает на: http://example.com/referer-hider?url={urlencoded(url)}

и позволить рефереру-перенаправителю перенаправить пользователя на внешнюю страницу, чтобы реферер содержал: http://example.com/referer-hider?url={urlencoded(url)}

Будет ли это работать? Или есть другое решение для этого (которое не требует модификации на стороне клиента)?

Ответы [ 3 ]

0 голосов
/ 11 декабря 2011

HTTP реферер не передается браузером при переходе по ссылке HTTPS-> HTTP.Таким образом, простое решение состоит в том, чтобы иметь страницу перенаправления https: https://yoursite/redirect?url=....Однако эта страница также уязвима для OWASP a10 - Непроверенные перенаправления и пересылки , но это может не иметь значения для вас.Другое решение, которое не подвергает вас OWASP a10, - это использование бесплатной службы перенаправления.

0 голосов
/ 12 декабря 2011

Предложение метареферала от Адама Барта поможет вам в вашем случае;Короче говоря, вы можете сказать браузеру через тег <meta>, что заголовок Referer должен быть удален на всех исходящих ссылках.

Это не полный ответ, поскольку он реализован пока только в Webkit, но это что-тоследите.

0 голосов
/ 11 декабря 2011

Поскольку реферер предоставляется браузером для веб-сервера, я вижу только два способа убедиться, что внешние сайты не видят этот «скрытый» URL.

Первый способ будет (как вы сказали), чтобы удалить внешние ссылки со скрытой страницы, запустив их через перенаправитель, который использует header("location: ...");).Да, это будет работать.Вы можете просто использовать это в целом, чтобы отслеживать выходы с вашего сайта.

Второй способ - перестать скрывать этот URL.В конце концов, он не будет скрыт навсегда.Google / Alexa / любая панель инструментов попадает на нее, и bam, она проиндексирована.Так что вместо этого встроите эту скрытую функциональность в нечто основанное на сеансахСоздайте сценарий, который изменяет свои выходные данные в зависимости от переменных сеанса и разрешает показ скрытого содержимого только в том случае, если люди вошли в систему или предварительно просмотрели свою запись или что-то подобное.

Третий (и, вероятно, лучший) способ - этореализовать надлежащий контроль доступа, чтобы анонимные пользователи не могли посетить страницу с ограниченным содержанием.Если вы хотите, чтобы анонимный оригинальный постер мог посещать СВОЮ СОБСТВЕННУЮ почту, вы можете отправить им файл cookie, а затем проверить файл cookie при посещении неутвержденного сообщения.

Например, после отправки на утверждение:

setcookie('postkey', mysql_insert_id());

Тогда:

$pieces=explode($_SERVER['PHP_SELF']);
$postid=$pieces[2]; // or whatever
if (!isset($_COOKIE['postkey'])) {
  header("Location: http://example.org/");
} else if ($_COOKIE['postkey'] != $postid) {
  header("Location: http://example.org/");
}

и т. Д.Возможно, вам нужна лучшая защита, чем эта, но она должна дать вам некоторые идеи.

...