HTTP_REFERER неправильно работает со сценарием тайм-аута?

У меня проблема, похожая на эту, но немного другая.

У меня это структурировано следующим образом: страница, на которую хочет перейти пользователь, похожа на displayData.php. Это страница, на которой они должны вернуться. Эта страница проверяет, вошли ли вы в систему и не истек ли срок действия сеанса:

if ($_SESSION["loggedIn"] != "YES")
{
  header ("Location: ".$baseURL."timeout.php");
  exit();
}

На timeout.php я проверяю реферер:

<?php
session_start();
$_SESSION['redirect'] = $_SERVER['HTTP_REFERER'];
$_SESSION["errorMessage"] = "Your session has timed out or<br>you have not logged in correctly.";
header ("Location: index.php");
exit();
?>

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

if(isset($_SESSION['redirect'])){
    header ("Location: ".$_SESSION['redirect']);
}else{
    header ("Location: menu.php");
}

Я думаю, что логически, когда страница тайм-аута устанавливает переменную с $_SERVER['HTTP_REFERER'];, она устанавливает ее на страницу, которая перенаправляется на timeout.php, в данном случае displayData.php. Однако кажется, что вместо этого он устанавливает реферер displayData.php (который может быть чем угодно, но это не то, к чему мы хотим отправить пользователя).

Является ли это предполагаемым эффектом HTTP_REFERER, чтобы не обновлять, если было перенаправление заголовка? Если это так, то это отстой, и мне нужно переписать около 80 файлов, чтобы изменить систему входа/тайм-аута. Я надеюсь, что будет более простой способ. Мы бы сделали это в системе, основанной на функциях, но в настоящее время мы пытаемся расширить устаревший код.

Большое спасибо.

Редактировать:

Чтобы быть немного более ясным здесь. Подумайте об этом в папке /admin/. displayData.php — это один из многих файлов, к которым можно получить доступ, только войдя в систему (поэтому мы не знаем, к какой именно странице они пытались получить доступ, когда обнаружилось, что они не вошли в систему). Каждая из этих страниц перенаправляется на timeout.php по истечении сеанса (или если сеанса вообще не было), поэтому я хочу, чтобы timeout.php мог определить страницу, к которой ранее обращались без сеанса, а затем сохраните эту информацию, чтобы ее можно было использовать позже для перенаправления пользователя обратно на исходную страницу, которую он запросил на нашем сайте.

Причина, по которой я хочу сделать это через файл timeout.php, заключается в том, что есть много файлов, таких как displayData.php, и я не хочу редактировать каждый из них, чтобы улучшить систему, если мне это не нужно, на данный момент.

Если это все еще недостаточно ясно, дайте мне знать.


person Brent    schedule 05.05.2011    source источник
comment
Я думаю, что вы немного неправильно сформулировали свой вопрос, он установит его на страницу, которая перенаправляется на timeout.php, в данном случае displayData.php. Однако кажется, что вместо этого он устанавливает реферер displayData.php. Является ли displayData желаемым реферером или нежелательным реферером?   -  person Dormouse    schedule 06.05.2011
comment
Я отредактировал вопрос, пожалуйста, дайте мне знать, если все еще неясно, о чем я спрашиваю.   -  person Brent    schedule 06.05.2011


Ответы (1)


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

Почему бы просто не установить $_SESSION['redirect'], когда вы на самом деле находитесь на странице, прежде чем она перенаправит вас на скрипт проверки сеанса? Если на то пошло, зачем вообще перенаправлять? Вы можете включить timeout.php в сценарий практически без изменений и использовать переменную $_SERVER['PHP_SELF'], чтобы определить, какое значение должно быть установлено для $_SESSION['redirect'].

person Cfreak    schedule 05.05.2011
comment
Однако проблема гораздо сложнее. Существует несколько файлов с одинаковым кодом для проверки входа в систему, поэтому, чтобы изменить его для перенаправления на что-то другое, кроме timeout.php, мне пришлось бы редактировать несколько файлов. Мой файл displayData.php — это всего лишь один пример, на самом деле существует множество других файлов, которые обрабатывают его таким же образом с тем же кодом. Как я уже сказал, это устаревший код, поэтому его просто копируют и вставляют в несколько файлов. Я хочу избежать необходимости редактировать каждый файл, который должен проверять сеанс, если это вообще возможно, и просто изменить один файл, к которому переходит каждая страница. - person Brent; 06.05.2011
comment
@brent - я понимаю, что вы не хотите редактировать файлы, но я просто честен, чтобы действительно исправить это, вы не хотите полагаться на реферера. Если вам просто нужно исправить одну страницу, которая не работает, установите $_SESSION['redirect'] перед перенаправлением на timeout.php - person Cfreak; 06.05.2011