Перейти к содержимому

Реферальная программа Мегаплана

Партнерская программа Kredov

Авторизация пользователей, нужна не большая помощь.

#1 SURkiss

SURkiss
  • Пользователь
  • 22 сообщений
  • Репутация: 0
0

Отправлено 16 Май 2012 - 14:51

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

Вот содержимое обработчика формы логина:
<?
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

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85
Советую обратить внимание на следующее:
  1. Нужна помощь по публикации контента на сайт
  2. Создал всплывающее окно, нужна помощь в настройке
  3. Проблема с дизайном сайта. Срочно нужна помощь((
  4. Нужна помощь по поводу CMS для Интернет Магазина
  5. Нужна помощь в исправлении РНР кода

#2 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 16 Май 2012 - 16:27

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('Логин или пароль введены неверно!');
		  }

  • 0


#3 SURkiss

SURkiss
    Topic Starter
  • Пользователь
  • 22 сообщений
  • Репутация: 0

Отправлено 16 Май 2012 - 17:27

Теперь всё проверяется, но не зависимо от того, введён ли правильно пароль (логин) или нет, получаем ошибку: "Логин или пароль введены неверно!"
Возможно вначале кода добавить выборку из базы переменной salt? Возможно в этом загвоздка?)
  • 0

#4 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 16 Май 2012 - 17:52

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

Ну логично, а иначе зачем соль?.. если Вы "солите" пароль и получаете двойной хэш перед помещением его в БД, то и при сравнении должна проводиться аналогичная процедура.
  • 0


#5 SURkiss

SURkiss
    Topic Starter
  • Пользователь
  • 22 сообщений
  • Репутация: 0

Отправлено 18 Май 2012 - 00:04

Сделал всё правильно, как мне кажется, но увы... всё таже ошибка. Добавил строку выборки с базы переменной 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('Неправильный логин!');
   }
}

  • 0

#6 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 18 Май 2012 - 08:10

Значит что-то сделано неверно. Распечатайте пароль, который вводится и тот, который достается из БД и сравните их.
  • 0


#7 SURkiss

SURkiss
    Topic Starter
  • Пользователь
  • 22 сообщений
  • Репутация: 0

Отправлено 20 Май 2012 - 02:57

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

  • 0

#8 matroskin8

matroskin8
  • Пользователь PRO
  • 767 сообщений
  • Репутация: 143

Отправлено 20 Май 2012 - 07:59

У вас для каждого пользователя своя соль?

пытаюсь вывести переменную salt

Здесь я вижу только запрос, вывода нет вообще... Как у вас, кстати, дела с PHP? Мне кажется, не мешало бы подтянуть основы.
  • 0


#9 SURkiss

SURkiss
    Topic Starter
  • Пользователь
  • 22 сообщений
  • Репутация: 0

Отправлено 20 Май 2012 - 21:23

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

  • 0

#10 c0ns0l3

c0ns0l3
  • Пользователь
  • 264 сообщений
  • Репутация: 49

Отправлено 20 Май 2012 - 22:51

пытаюсь вывести переменную 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/fu...sql-fetch-array, или http://www.php.su/fu...mysql-fetch-row (тебе данный вариант подойдет больше).
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru