Cookie + токен + аутентификация сессии - PullRequest
2 голосов
/ 17 ноября 2010

У меня есть небольшое веб-приложение, в котором используется много AJAX.После того, как кто-то войдет в систему, нам нужно сохранить постоянство их user_id и group_id

. То, как я впервые сделал аутентификацию, я просто сохранил как открытый текст в куки ($ _COOKIE ['user_id'], $ _COOKIE ['group_id']).Очевидно, это было плохо, так как вы могли изменить оба значения!

Я не опытный программист и не нуждаюсь в поразительной безопасности этого приложения.Но это было довольно плохо.

Итак, я перешел к созданию токена в базе данных, в котором хранятся user_id, group_id и хеш-токен, а затем поместил этот токен только в cookie.User_id и group_id создаются как сеансы после проверки подлинности токена (база данных соответствия файлов cookie).

Это более безопасно, но все дело в необходимости управлять сеансами user_id и group_id (тайм-ауты, повторная инициализация) и просто захватыватьони из файлов cookie вызвали много горя и сделали реальное функционирование моего приложения менее надежным.

Теперь, принимая мой уровень мастерства, и то, что простое управление + надежное функционирование моего приложения важнее, чем высокий уровень безопасности... Мне интересно, смогу ли я покончить с сессиями и пойти на компромисс, сохранив user_id и идентификатор группы в cookie, но вместе с хешем - т.е.

COOKIE ['token'] =user_id_val + group_id_val + hash_in_db

будет выглядеть следующим образом: 23-144-jhwr8324398fjk2j49083223n23

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

Это нормально?

1 Ответ

2 голосов
/ 17 ноября 2010

Вам не нужны файлы cookie (ну, кроме файла cookie сеанса) для аутентификации. Вот пример простой аутентификации без файлов cookie:

session_start();

// $db is a pseudo object for database access

// Verify login
$auth = false;
if (isset($_SESSION['user_id']) && isset($_SESSION['user_hash'])) {
   $user = $db->getUserById($_SESSION['user_id']);
   if ($user) {
      $hash = sha1($user->id.$user->salt);
      if ($hash === $_SESSION['user_hash']) $auth = true;
   }
}

// Make login
if (isset($_POST['login'])) {
   $user = $db->getUserByCredentials($_POST['login'], $_POST['password']);
   if ($user) {
      $_SESSION['user_id'] = $user->id;
      $_SESSION['user_hash'] = sha1($user->id.$user->salt);
      // redirect...
   }
   // redirect to error page
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...