проверить uniqid для сессии

Для аутентификации пользователя мой клиент перенаправляется на сервер и получает пользовательские данные, и я сохраняю их в собственном сеансе php на стороне клиента. В этом процессе сервер перенаправляет обратно на тот же запрошенный URL-адрес, поэтому, если в ответ нет данных, на стороне клиента не будет сеанса, и мой скрипт завершится циклом перенаправления, поскольку есть проверка для перенаправления на сервер, только если сеанс не найден .

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

Для этого я проверяю значение файла cookie сеанса. Если cookie имеет заданный мной префикс (указанный в uniqid), то это недействительный сеанс и перенаправление на сервер. Я хочу знать, насколько надежен этот вариант? Есть ли у меня другое решение?

Обновление: вот как выглядит моя функция validSession:

public function validSession() {
if ($sessionCookie !== null && substr($sessionCookie,0,7) !== 'prefix_')
return true;
return false;
}

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


person CM.    schedule 18.05.2011    source источник
comment
слишком много путаницы без кода.. пожалуйста, добавьте код к вашему вопросу..   -  person Muhammad Ummar    schedule 18.05.2011


Ответы (1)


Похоже на проблему с управлением потоком. Просто не перенаправляйте обратно, если вход не удался.

@session_start();
$user = Auth::login($username, $pwd);
if (!empty($user))
{
  $_SESSION['auth_user'] = $user;
  session_write_close();
  header('Location: '.$_REQUEST['next']);
}
else
{
  header('Location: '.Auth::STANDARD_LOGIN_URL);
}

В этом примере используется псевдокласс Auth со статическим методом входа в систему (возвращает пользователя или false/null в случае ошибки) и константой, определяющей, куда идти для входа в систему.

person John Green    schedule 18.05.2011
comment
Подавление потенциальных ошибок, вызванных session_start(), таких как невозможность установки файлов cookie сеанса, — отличный способ впоследствии столкнуться с трудными для отладки проблемами. - person ThiefMaster; 18.05.2011
comment
Обычно нет необходимости вызывать session_write_close() — это делается автоматически. Вам это нужно только в том случае, если скрипт собирается выполнять какие-то трудоемкие действия после завершения доступа к сеансу. - person ThiefMaster; 18.05.2011
comment
Я могу купить этот аргумент, однако проблема № 1 в коде заключается в том, что вы не можете легко узнать, был ли запущен сеанс, если у вас есть куча кода... и правильная настройка управления усложнила бы мою работу. упрощенная демонстрация значительно. Это одна из причин, по которой мои стандартные классы имеют абстракцию для всего управления сеансами. - person John Green; 18.05.2011
comment
@ThiefMaster - полностью не согласен с аргументом session_write_close, если вы выполняете немедленное перенаправление - это АБСОЛЮТНО самое важное время для вызова session_write_close. В противном случае он может быть потерян, так как жизненный цикл PHP завершается при вызове клиентом reset нового URL-адреса для перенаправления. - person John Green; 18.05.2011
comment
Почему бы просто не exit() после отправки заголовка? Кроме того, браузер не будет обрабатывать перенаправление, пока все не будет получено - и в этом случае скрипт завершился и, таким образом, закрыл сеанс. - person ThiefMaster; 18.05.2011
comment
По моему опыту, браузер может/обработает заголовок до того, как сценарий завершится. Выход;' вызов должен в основном работать, но я определенно видел проблемы с этим и в прошлом. На самом деле, я только что подчистил некоторые комментарии двухлетней давности в каком-то коде, проклинающие именно эту проблему с некоторыми довольно красочными ругательствами. - person John Green; 18.05.2011
comment
@John, что, если нет стандартного URL-адреса для входа? скажем, какой-то виджет, который будет отображать пользовательские данные, если сеанс существует, в противном случае просто показывает форму входа. - person CM.; 18.05.2011
comment
@CM - Хорошо, тогда управление потоком снова меняется. Я обращался к проблеме Op, связанной с застреванием в цикле перенаправления. Похоже, он перехватывает, вошел ли пользователь в систему, перенаправляет на страницу входа, если это не так, а затем перенаправляет обратно, даже в случае неудачного входа. В вашем примере вы не будете делать перенаправления... черт возьми, вы, вероятно, просто запустите сеанс и выполните простое условие, основанное на этом. Оттуда вы будете записывать данные на основе этого условия. - person John Green; 18.05.2011
comment
@John, я ОП :), и мой случай такой же ... Мне нужно проверить с той же страницы, если сеанс существует, не перенаправлять, иначе сделайте перенаправление на сервер. и поэтому возникает проблема цикла перенаправления. - person CM.; 18.05.2011
comment
смешной. Извини. Перенаправить на сервер? Этот вопрос больше касается совмещения аутентификации со сторонним решением для управления аутентификацией (например, OpenID)? - person John Green; 18.05.2011
comment
Хорошо, сторонняя аутентификация дает вам обратный вызов, верно? Это означает, что вы знаете, находитесь ли вы в одном из следующих контекстов: Authed, Failed Auth, No Auth. Для Authed вы показываете свой контент. Для No Auth (при условии, что это обязательно) вы перенаправляетесь на сервер аутентификации. Для Failed Auth вы выводите на экран сообщение с просьбой повторить попытку (и не показывать никакого «фактического» контента). Хотя я не уверен, что понимаю, что вы делаете... потому что неудачная аутентификация должна завершиться ошибкой на сервере аутентификации, и там о ней позаботятся. - person John Green; 18.05.2011
comment
ну, в моем случае, у меня нет этих 3 доступных вариантов, хотя есть некоторые параметры, которые я получаю в ответ, поэтому я проверю их. Между тем, не могли бы вы сказать мне, является ли подход, который я упомянул в своем вопросе, надежным с точки зрения безопасности? - person CM.; 19.05.2011