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

Форум MySQL

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

 

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

вид форума:
Линейный форум Структурный форум

тема: md5 хеширование
 
 автор: probnik   (21.03.2009 в 12:44)   письмо автору
 
 

Необходима авторизация пользователя - его пароль должен быть захеширован MD5?
1) Создал таблицу users:

CREATE TABLE users (
id_user INT NOT NULL auto_increment,
name TINYTEXT,
password TINYTEXT,
PRIMARY KEY (id_user)
) TYPE=MyISAM;

и заполнил её (2 users):
INSERT INTO users VALUES(NULL, 'user1', MD5('pass1'));
INSERT INTO users VALUES(NULL, 'user2', MD5('pass2'));

2) в итоге пароли 'pass1, 2':

id_user name password
1 user1 a722c63db8ec8625af6cf71cb8c2d939
2 user2 c1572d05424d0ecb2a65ec6a82aeacbf

3) использую сессию для формы (index.php):

<?php
// Это файл index.php
session_start();
?>
<form action=handler.php method=post>
Имя посетителя : <input type=text name=name value=<?php echo $_SESSION['user']; ?>><br>
Пароль : <input type=password name=password value=<?php echo $_SESSION['password']; ?>><br>
<input type=submit value=Отправить>
</form>
<?php
// Если посетитель "вошёл" - приветствуем его
if(isset($_SESSION['user'])) echo "Здравствуйте, ".$_SESSION['user']."!";
?>


4) использую сессию для обработчика (handler.ru):

<?php
// Это файл handler.php
$dblocation = "localhost";
$dbname = "test";
$dbuser = "root";
$dbpasswd = "";
// Соединяемся с сервером базы данных
$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnx) {
echo( "<P>В настоящий момент сервер базы данных не
доступен, поэтому корректное отображение
страницы невозможно.</P>" );
exit();
}
// Выбираем базу данных
if (! @mysql_select_db($dbname,$dbcnx) ) {
echo( "<P>В настоящий момент база данных не доступна,
поэтому корректное отображение страницы
невозможно.</P>" );
exit();
}
// Формируем и выполняем SQL-запрос для посетителя с
// именем $_POST['name']
$query = "SELECT password FROM users WHERE name='".$_POST['name']."'";
$nme = mysql_query($query);
if(!$nme)
{
echo mysql_error();
echo "Ошибка выполнения запроса";
exit();
}
// Если запрос вернул результат - производим дальнейшую обработку
if(mysql_num_rows($nme) > 0)
{
// Получаем пароль
$password = mysql_result($nme, 0);
// Сравниваем пароль из базы данных и введённый посетителем
if ($_POST['password'] == $password)
{
// Идентификация прошла успешно - осуществляем
// "вход" посетителя. Для того, чтобы в течении текущей
// сесси посетитель не вводил своё имя пароль повторно -
// передаём их через сессию
if(session_start())
{
$_SESSION['user'] = $_POST['name'];
$_SESSION['password'] = $_POST['password'];
// Осуществляем автоматический переход на
// страницу index.php чтобы убедится, что
// посетитель "вошёл"
echo "<HTML><HEAD>
<META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php'>
</HEAD><body>";
}
}
else
{
echo "Ошибка идентификации: неправильный пароль";
exit();
}
}
// Если в результате запроса не получено ни одной
// строки - посетитель с таким именем не зарегистрирован
else
{
echo "Ошибка идентификации: посетитель не зарегистрирован";
exit();
}
?>


4.1) как добавить схешированый пароль в (handler.php)???

  Ответить  
 
 автор: Zend72   (22.03.2009 в 13:56)   письмо автору
 
   для: probnik   (21.03.2009 в 12:44)
 

Это ваш файл handler.php

<?php 
//...
//.Много полезного кода
//...

// Если запрос вернул результат - производим дальнейшую обработку 
if(mysql_num_rows($nme) > 0

// Получаем хэш пароля из базы данных 
$password mysql_result($nme0); 
// Сравниваем хэш пароля из базы данных и свежезахэшированный пароль введенный
//пользователем 
if (md5($_POST['password'])  == $password

// Идентификация прошла успешно - осуществляем 
// "вход" посетителя. Для того, чтобы в течении текущей 
// сесси посетитель не вводил своё имя пароль повторно - 
// передаём их через сессию 
if(session_start()) 

$_SESSION['user'] = $_POST['name']; 
$_SESSION['password'] = md5($_POST['password']); 
// Осуществляем автоматический переход на 
// страницу index.php чтобы убедится, что 
// посетитель "вошёл" 

//...
//.Много полезного кода
//...
?>

  Ответить  
 
 автор: probnik   (22.03.2009 в 15:48)   письмо автору
 
   для: Zend72   (22.03.2009 в 13:56)
 

спасибо с хешем разобрался :)

  Ответить  
 
 автор: Zend72   (22.03.2009 в 15:49)   письмо автору
 
   для: probnik   (22.03.2009 в 15:48)
 

Можете теперь, со спокойной душой, с безопасностью разбираться ;-)

  Ответить  
 
 автор: winflip   (22.03.2009 в 14:58)   письмо автору
 
   для: probnik   (21.03.2009 в 12:44)
 

Если вы так будете делать:
$query = "SELECT password FROM users WHERE name='".$_POST['name']."'";
, то вы SQL инъекции вам обеспечены. Необходимо переменные $_POST, $_GET предварительно обрабатывать функцией mysql_escape_string или mysql_real_escape_string.

  Ответить  
 
 автор: probnik   (22.03.2009 в 15:51)   письмо автору
 
   для: winflip   (22.03.2009 в 14:58)
 

так подскажите как именно $_POST обрабатывать функцией mysql_escape_string или mysql_real_escape_string ???

  Ответить  
 
 автор: Zend72   (22.03.2009 в 15:56)   письмо автору
 
   для: probnik   (22.03.2009 в 15:51)
 

http://softtime.ru/forum/read.php?id_forum=1&id_theme=63501&page=3

  Ответить  
 
 автор: probnik   (22.03.2009 в 21:19)   письмо автору
 
   для: Zend72   (22.03.2009 в 15:56)
 

Для начала проверю ввод данных:

// Выбираем базу данных
...
}
// Извлекаем данные из суперглобального массива $_POST
$name = $_POST['name'];
$password = $_POST['password'];
if(!preg_match("|^[\w\d\. ]+$|i", $name))
exit("Неверный формат имени");
if(!preg_match("|^[\w\d\. ]+$|i", $password))
exit("Неверный формат пароля");
// Дальнейшая обработка данных - проверка правильности пароля

Потом пробую с обработать mysql_escape_string:
// Формируем и выполняем SQL-запрос для $_POST['name']

$query = "SELECT * FROM " . $prefix . "_users
WHERE name= '" . mysql_escape_string( $name). "'
AND password = '" . mysql_escape_string( $password ) . "'";
$nme = mysql_query($query);
if(!$nme)
...

Выдаёт: не зарегестрирован в БД???

  Ответить  
 
 автор: Лерк   (22.03.2009 в 21:25)   письмо автору
 
   для: probnik   (22.03.2009 в 21:19)
 

В целом тут тока одна ошибка. Нужно еще применять stripslashes, если get_magic_quotes_gpc() == 1, то есть
$name = $_POST['name'];
$password = $_POST['password'];
if(get_magic_quotes_gpc()) {
$name = stripslashes($name);
$password = stripslashes($password);
}


А так смотрите сами почему Вам выдает не то, что хотите - из приведённого куска кода вытряхнуть интересного больше ничего нельзя. Может быть Вы действительно не зарегистрированы :-)

  Ответить  
 
 автор: probnik   (22.03.2009 в 22:13)   письмо автору
 
   для: Лерк   (22.03.2009 в 21:25)
 

Как раз зарегистрирован:)
В строке ошибся,
($prefix) не надо, я ж по паролю пользователей, а не по их номеру, т.е.:
$query = "SELECT password FROM users
WHERE name = '" . mysql_escape_string( $name ). "'
AND password = '" . mysql_escape_string( $password ) . "'";

Но всё равно выдаёт: Ошибка идентификации: посетитель не зарегистрирован.

Пока было: $query = "SELECT password FROM users WHERE name='".$_POST['name']."'";
Авторизировало нормально!

Где может быть ошибка??

  Ответить  
 
 автор: Trianon   (22.03.2009 в 21:27)   письмо автору
 
   для: probnik   (22.03.2009 в 21:19)
 

Имеет смысл привести весь код.
И желательно в тегах [code]

  Ответить  
 
 автор: probnik   (23.03.2009 в 22:27)   письмо автору
 
   для: Trianon   (22.03.2009 в 21:27)
 

так код же выложен 21.03.2009 в 12:44!!!
Подскажите что не так???

  Ответить  
 
 автор: Trianon   (23.03.2009 в 22:52)   письмо автору
 
   для: probnik   (23.03.2009 в 22:27)
 

Вы же его изменили после этого?
И жаловаться стали на тот, что 22.03 21:19
Кстати, он тоже не оформлен.

  Ответить  
 
 автор: probnik   (22.03.2009 в 22:34)   письмо автору
 
   для: winflip   (22.03.2009 в 14:58)
 

Немного поэксперементировав получил необходимое!
Спасибо всем участникам;)

  Ответить  
Rambler's Top100
вверх

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