Ситуация:
Всякий раз, когда пользователь входит в мою панель — я генерирую:
secret
сессия с секретным токеном, сгенерированным случайным образом. ip
+ cookie session id
+ и это secret
соединены вместе. ip
+ cookie session id
+ secret
это сохраняется в сеансе, и проверьте, если я хэширую их вместе — я получаю предыдущий результат. secret
меняй его cookie session id
и сделать все это снова. Так что в основном это происходит при каждом обновлении / навигации по страницам. (и, конечно, перенаправить пользователя на новую страницу).Проблема:
Всякий раз, когда я загружаю страницу, страница загружается правильно, если я отправляю ajax-запрос, я получаю ответ, но этот запрос устанавливает новые переменные (что я думаю, это проблема сейчас). Поэтому, если я нахожусь на той же странице и выполняю другой запрос ajax, я получаю ошибку 302 в журнале «Сеть» и перенаправление на страницу входа (которая очищает все мои данные сеанса).
Как я могу заставить это работать должным образом, не нарушая безопасность фиксации сеанса?
Этот метод вызывается для каждой конструкции (Controller.class.php):
/**
*
* Check if a user is logged in
*
*/
protected function is_loggedin()
{
# Flag for final result:
$flag = false;
# init user obj
$this->system_user = new System_user();
# Check if user is logged in
if ($this->system_user->check_logged_in()) {
# Check if the user is timed-out
if (!$this->system_user->check_timeout()){
# If system user exists
// if ( $this->system_user->find(intval(Session::get(Config::$session_name))) ){
# Re-generate users secret stuff
$this->system_user->generate_security_sessions();
$flag = true;
// }
}
}
# To return true "it" must pass all "if"s
if ( $flag )
# Return System_user object
return $this->system_user;
else
return false;
}
И это тот случай, когда я называю это примером (Users.contoller.php):
<?php
/**
*
* Dashboard Controller: Main user display
*
*/
class Users extends Controller
{
/**
*
* Constructor
*
*/
public function __construct()
{
# Check if system user is logged in / still logged in / Validate tokens
$this->system_user = $this->is_loggedin();
# Redirect to login if user not logged in
if (!$this->system_user){
Redirect::to('login');
}
}
пс: system user
не является user
в этом случае. (system user
зарегистрированный пользователь, user
пользователь, которого системный пользователь может редактировать [например]).
PS2: Регенерация secret
и cookie session id
для дополнительной безопасности в случаях, когда хакер подделывает сеанс клиента после входа в систему.
Задача ещё не решена.
Других решений пока нет …