Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Проверьте технологию зашиты

Сообщения:  [1-2] 

 
 автор: BinLaden   (24.08.2008 в 14:39)   письмо автору
 
   для: Nytrogen   (21.08.2008 в 17:48)
 

Инициализация $_SESSION['UserID'] и $_SESSION['SessionID'] (не несёт вообще никакой смысловой нагрузки) просходит, как видно из этого урезанного кода, только после успешной аутентификации, пройти которую невозможно, потому что $_SESSION['SessionID'] проверяется, которого изначально не существует.

Нельзя на время создания сессии проверять что-то, связанное с сессией. У Вас есть логин, пароль. Их достаточно для проверки.

  Ответить  
 
 автор: Nytrogen   (21.08.2008 в 17:48)   письмо автору
 
 

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

Имеется три страницы: login.php, logout.php и secretPage.php.

В базе данных хранится таблица учёта пользователей:
*) ID - уникальный идентификатор записи;
*) Username - ник;
*) Password - пароль;
*) SessionID - идентификатор сессии;
*) LastVisit - время последнего входа на сайт.

login.php представляет из себя нечто следующее:
session_start();
if ($_POST['sent')) {
  //если значения формуляра уже отправлены,
  checkLogin();
}

function checkLogin() {
  //проверяем корректность введённых данных и выводим сообщения об ошибках...
  if ($error) {
    return false;
  }
  //посылаем SQL-запрос Where Username = $_POST['Username']...
  if ($number_of_rows != 1) {
    return false;
  }
  //если введённый пароль и пароль в БД не совпадают, то выходим...
  if (md5($_POST['Password']) != $password_in_DB) {
    return false;
  }
  //если ID сессий совпадают, и при этом макс.время не вышло, то юзер уже залогинен...
  if ($_SESSION['SessionID'] == $sessionID_in_DB AND $not_time_out) {
    return false;
  }
  //если в БД хранится другой SessionID, то вход с таким именем уже выполнен...
  if ($sessionID_in_DB != "" AND $not_time_out) {
    return false;
  }
  //если всё ОК, то пускаем юзера...
  //обновляем строку таблицы, Where ID = $userID:
  //LastVisit = now();
  //SessionID = session_id();
  $_SESSION['UserID'] = $userID;
  $_SESSION['SessionID'] = session_id();
}


А вот для secretPage.php меня хватило только на такое:
session_start();
//чувствую, одного if'а здесь мало %)
if (!$_SESSION['UserID'] OR !$_SESSION['SessionID']) {
  //перекидываем на login.php
} else {
  <html>Совершенно секретно!</html>
}

  Ответить  

Сообщения:  [1-2] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования