Перенаправления и рефереры - PullRequest
3 голосов
/ 04 декабря 2010

Моя реальная реализация этого намного сложнее, с аутентификацией и множеством других вещей, но в самой простой форме, вот проблема, с которой я столкнулся.Перенаправление с заголовком не показывает себя в качестве реферера.

Итак, допустим, у меня есть три страницы: start.php, middle.php и end.php

start.php

<html><body>
<a href="middle.php">middle</a>
</body></html>

middle.php

<?php
header('Location: end.php');
?>

end.php

<?php
    echo 'The referer is: ' . $_SERVER['HTTP_REFERER'];
?>

Когда вы переходите по ссылке, вы попадаете на end.php, но реферер не средний.php.Есть ли какой-либо другой метод перенаправления, который я могу использовать, чтобы исправить это, или что-то еще, что я могу сделать?участник вечеринкиЕдинственный метод, который они должны проверить, - это обновить URL.Я не могу это контролировать.Мне просто нужна моя страница, которая выполняет перенаправление, чтобы отправить правильный URL.Есть ли альтернативы этому методу перенаправления, вместо того, чтобы выделять причины не доверять http_referer?

Ответы [ 6 ]

3 голосов
/ 04 декабря 2010

Извините, но это вне вашего контроля, только браузер может отправить этот заголовок - и не все делают.Его можно легко подделать, поэтому не надейтесь на него.

Более подробная информация доступна по этому php bug (который был помечен как не ошибка).

1 голос
/ 04 декабря 2010

Поскольку HTTP_REFERER не заслуживает доверия (его можно легко изменить извне), вы можете легко сохранить последнюю страницу, посещенную в сеансе, после каждого запроса.Затем легко получить его при перезагрузке.

Это означает загрузку реферера как $ referring_url = $ _SESSION ["referring_url"].Затем сохраните его $ _SESSION ["referring_url"] = $ current_absolute_url;при завершении каждого запроса.

Обратите внимание, что это может быть проблемой параллелизма.Наличие параллельных запросов (с использованием, например, AJAX) может легко заставить сеанс поверить, что он пришел со страницы, которой на самом деле не было.

Получение абсолютного пути текущего запроса

0 голосов
/ 23 декабря 2010

Я пошел со старым метаданным методом обновления перенаправления.Это сохраняет URL ссылки в такте для поставщиков, которым это необходимо.Любой поставщик, которому это не нужно, все еще использует функцию заголовка для скорости и простоты использования.

0 голосов
/ 04 декабря 2010

Для чего вы пытаетесь использовать информацию заголовка Referrer?

Если это для аутентификации / проверки подлинности источника запроса, то вы можете попробовать другой подход.Как отметил Эль Йобо, заголовок Referrer не является надежным способом определения, откуда поступил чей-то запрос.

0 голосов
/ 04 декабря 2010

Я бы предложил что-то вроде этого:

header('Location: end.php?from=' . urlencode($_SERVER['PHP_SELF'));

А затем на странице, где вы хотите узнать, откуда был произведен редирект:

echo 'redirected from ' . urldecode($_GET['from']);
0 голосов
/ 04 декабря 2010

Этот вопрос несколько раз всплывал на SO (хотя сейчас я не могу найти никаких дупликов), и я всегда думаю, что суть в том, что в стандарте не определено, что браузер устанавливает ссылаюсь на в этой ситуации.

Можно ли указать это явно, используя параметр GET или что-то в этом роде?

...