X   Сообщение сайта
(Сообщение закроется через 3 секунды)



 

Здравствуйте, гость (

| Вход | Регистрация )

2 страниц V   1 2 >
Открыть тему
Тема закрыта
> Авторизация пользователей, нужна не большая помощь.
SURkiss
SURkiss
Topic Starter сообщение 16.5.2012, 15:51; Ответить: SURkiss
Сообщение #1


Всем привет. Подкорректируйте, пожалуйста, немного код. Скрипт проверяет существование логина в базе и его корректность, а также активирован ли аккаунт пользователя. Но какой пароль не вводил бы, при правильном логине, сессия запускается и пользователю видно скрытое содержимое. Подскажите, пожалуйста, как реализовать правильно проверку захешированного пароля в базе и того, который вводит зарегистрированный пользователь?

Вот содержимое обработчика формы логина:
<?
if (isset($_POST['login']) && isset($_POST['password'])) {
  // переменная $salt трёхзначное число, которое хранится в базе
   $passwordHash = md5(md5($_POST['password']).$salt);
   $login = $_POST['login'];
   // Проверка логина на плохие символы
   if (!preg_match("/^w{3,}$/", $login)) {
      die('Неправильный логин!');
   }
}
   $dbuser = 'regz';
   $dbpass = '123456';
   $link = mysql_connect('localhost',$dbuser,$dbpass);
   if (!$link) {
      die('Не удалось соединиться с БД');
   }else{
      mysql_select_db('regz', $link);
      $res = mysql_query("SELECT status FROM users WHERE login='$login'", $link);
      // Есть ли пользователь с таким логином?
      if (mysql_num_rows($res) < 1) {
         mysql_close($link);
         die('Такого пользователя нет!');
      }
      // Какой статус у пользователя?
      if (mysql_result($res, 0) != 1) {
         mysql_close($link);
         die('Логин не активирован!');
      }
      // Стартуем сессию и записываем логин в суперглобальный массив $_SESSION
      session_start();
      $_SESSION['user'] = $login;
      mysql_close($link);
      // Если определена страница с которой мы пришли,
      // на нее и переадресуем, либо на главную
      if (isset($_SERVER['HTTP_REFERER'])) {
         header ("location: ".$_SERVER['HTTP_REFERER']);
      }else {
         header ("location: index.php");
      }
   }
?>


Заранее благодарю за ответ.
0
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 16.5.2012, 17:27; Ответить: matroskin8
Сообщение #2


[member=SURkiss], Вы получаете пароль в переменную $passwordHash, но нигде не используете его в проверке, т.е. проверяется только логин. Добавьте его в запрос, проверяя не только логин, но и пароль:
$res = mysql_query("SELECT status FROM users WHERE login='$login' AND pass='$passwordHash' LIMIT 1", $link);
          // Есть ли пользователь с таким логином?
          if (mysql_num_rows($res) < 1) {
                 mysql_close($link);
                 die('Логин или пароль введены неверно!');
          }
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
SURkiss
SURkiss
Topic Starter сообщение 16.5.2012, 18:27; Ответить: SURkiss
Сообщение #3


Теперь всё проверяется, но не зависимо от того, введён ли правильно пароль (логин) или нет, получаем ошибку: "Логин или пароль введены неверно!"
Возможно вначале кода добавить выборку из базы переменной salt? Возможно в этом загвоздка?)
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 16.5.2012, 18:52; Ответить: matroskin8
Сообщение #4


Возможно вначале кода добавить выборку из базы переменной salt? Возможно в этом загвоздка?)

Ну логично, а иначе зачем соль?.. если Вы "солите" пароль и получаете двойной хэш перед помещением его в БД, то и при сравнении должна проводиться аналогичная процедура.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
SURkiss
SURkiss
Topic Starter сообщение 18.5.2012, 1:04; Ответить: SURkiss
Сообщение #5


Сделал всё правильно, как мне кажется, но увы... всё таже ошибка. Добавил строку выборки с базы переменной salt, но всё равно пароли не совпадают.
$salt = mysql_query("SELECT salt FROM users WHERE login='$login' LIMIT 1");
if (isset($_POST['login']) && isset($_POST['password'])) {
  // переменная $salt трёхзначное число, которое хранится в базе
   $passwordHash = md5(md5($_POST['password']).$salt);
   $login = $_POST['login'];
   // Проверка логина на плохие символы
   if (!preg_match("/^w{3,}$/", $login)) {
      die('Неправильный логин!');
   }
}
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 18.5.2012, 9:10; Ответить: matroskin8
Сообщение #6


Значит что-то сделано неверно. Распечатайте пароль, который вводится и тот, который достается из БД и сравните их.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
SURkiss
SURkiss
Topic Starter сообщение 20.5.2012, 3:57; Ответить: SURkiss
Сообщение #7


пытаюсь вывести переменную salt, при этом получаю вот что "Resource id #5". Переменная salt просто напросто не подставляется в $passwordHash и как результат, пароль в базе и введённый не совпадают. Почему $salt не выводиться, я же правильно указал всё...
$salt = mysql_query("SELECT salt FROM users WHERE login='$login' LIMIT 1");
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
matroskin8
matroskin8
сообщение 20.5.2012, 8:59; Ответить: matroskin8
Сообщение #8


У вас для каждого пользователя своя соль?
пытаюсь вывести переменную salt

Здесь я вижу только запрос, вывода нет вообще... Как у вас, кстати, дела с PHP? Мне кажется, не мешало бы подтянуть основы.
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
SURkiss
SURkiss
Topic Starter сообщение 20.5.2012, 22:23; Ответить: SURkiss
Сообщение #9


Вывод просто не написал:) здесь тобишь). Вот что я пишу сразу после этого
if (!preg_match("/^w{3,}$/", $sLogin)) {
      die('Неправильный логин!');
   }

написал вывод переменных. Введённый пароль показывает, но захешированный без "соли" и вместе самой $salt выводит Resource id #5
   echo "Вот веддёный пароль {$passwordHash}, а вот переменная salt с базы данных {$salt}";
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
c0ns0l3
c0ns0l3
сообщение 20.5.2012, 23:51; Ответить: c0ns0l3
Сообщение #10


пытаюсь вывести переменную salt, при этом получаю вот что "Resource id #5". Переменная salt просто напросто не подставляется в $passwordHash и как результат, пароль в базе и введённый не совпадают. Почему $salt не выводиться, я же правильно указал всё...
$salt = mysql_query("SELECT salt FROM users WHERE login='$login' LIMIT 1");


Матроскин имел в виду то, что переменная $salt является ресурсом ответа mysql, о чем тебе и говорится при попытке echo этой переменной. Ты должен еще обработать этот query. http://www.php.su/functions/?mysql-fetch-array, или http://www.php.su/functions/?mysql-fetch-row (тебе данный вариант подойдет больше).
Вернуться в начало страницы
 
Ответить с цитированием данного сообщения
2 страниц V   1 2 >
Открыть тему
Тема закрыта
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


Свернуть

> Похожие темы

  Тема Ответов Автор Просмотров Последний ответ
Открытая тема (нет новых ответов) Нужна програмка постинга в свои сайты
0 kasey7 353 22.4.2024, 19:54
автор: kasey7
Открытая тема (нет новых ответов) Требуется помощь по сайту на "ВордПресс"
Закрылся доступ в панель администратора
15 Tia2 2393 17.4.2024, 0:54
автор: diviner99
Горячая тема (нет новых ответов) Тема имеет прикрепленные файлыСостояние после ампутации - нужна помощь
благотворительный топик
49 vitvirtual 5899 1.4.2024, 5:23
автор: vitvirtual
Открытая тема (нет новых ответов) Нужна ли плоская структура категорий в ИМ?
1 noviktamw 1187 26.3.2024, 21:50
автор: c4p1t4l15t
Открытая тема (нет новых ответов) требуется помощь с themasoftware (Темапостером)
0 Taylor 631 16.3.2024, 18:41
автор: Taylor


 



RSS Текстовая версия Сейчас: 25.4.2024, 17:06
Дизайн