Редиректы и рефереры

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

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

start.php

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

средний.php

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

конец.php

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

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

Ваше здоровье

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


person Cory Dee    schedule 03.12.2010    source источник
comment
Имейте в виду, что рефереру нельзя доверять. Вы можете отправить свой собственный или вообще ничего не отправлять. Здесь мне на ум приходит Origin-заголовок.   -  person jwueller    schedule 04.12.2010
comment
Это правда, но мы все равно проверяем сеансы. Если у вас нет действительного сеанса, вы будете отправлены для входа в систему.   -  person Cory Dee    schedule 04.12.2010


Ответы (6)


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

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

person El Yobo    schedule 03.12.2010

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

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

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

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

person Robin Orheden    schedule 03.12.2010
comment
Или даже на простых страницах без AJAX, нескольких вкладок или окон браузера. Сложно уследить за этим... - person El Yobo; 04.12.2010

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

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

person Pekka    schedule 03.12.2010

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

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

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

echo 'redirected from ' . urldecode($_GET['from']);
person karim79    schedule 03.12.2010

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

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

person Tom    schedule 03.12.2010

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

person Cory Dee    schedule 23.12.2010