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

Форум MySQL

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

 

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

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

тема: Хэш в базу данных
 
 автор: winflip   (22.03.2009 в 14:52)   письмо автору
 
 

Добрый день уважаемые форумчане.
Вопрос к знающим perl.
В общем есть база, таблицы - всё это в кодировке utf8. Хэширую пароль в md5, не md5_hex, не md5_base64 и при добавлении в базу поосле обработки функцией quote модуля DBI. В базе остаётся нечто не похожее: либо e{ либо вообще ничего, в общем на хэш не похожее. Проблема появилась ВОЗМОЖНО после изменения кодировки, хотя связи почти не вижу. При подключении делаю запрос SET NAMES UTF8.

  Ответить  
 
 автор: ddhvvn   (22.03.2009 в 14:57)   письмо автору
 
   для: winflip   (22.03.2009 в 14:52)
 

Вы яснее пишите, а то увидев "вопрос к знающим perl", я решил что речь идет о виде массивов...

  Ответить  
 
 автор: winflip   (22.03.2009 в 15:05)   письмо автору
 
   для: ddhvvn   (22.03.2009 в 14:57)
 

А что яснее то тут писать?))))) Получаю переменную методом POST, коннектюсь к базе(utf8), посылаю команду SET NAMES UTF8.

#!/usr/bin/perl
use mysql; #Подключение и отправка SET NAMES UTF8
use CGI qw(:standard);
my $password = param('password');
use Digest::MD5 qw(md5); #Не помню регистр модуля, но функция подключается
$password = md5($password);
$mysql::dbh->quote($password); #mysql::dbh - это обект модуля DBD::Mysql;
my $sth = $mysql::dbh->do("INSERT INTO tbl VALUES($password)"); 

  Ответить  
 
 автор: winflip   (22.03.2009 в 15:29)   письмо автору
 
   для: winflip   (22.03.2009 в 15:05)
 

#!/usr/bin/perl
use strict;
use CGI qw(:standard);
use lib "libperl";
use mysql;
use Digest::MD5 qw(md5);
use sess;
use header;
my $check = param('check') || undef;
my @error = ();
if(defined $check){
    my $user = param('user');
    my $email = param('e-mail');
    my $password = param('password');
    my $repeat_password = param('repeat_password');
    unless($user =~ m/\A[a-z0-9\_]+\z/i){
        $error[0]  = 1;
    }
    unless($email =~ m/\A[a-z0-9\.\_]+@[a-z0-9\_]+\.[a-z0-9\_\.]+\z/i){
        $error[1] = 1;
    }
    if(length($user) > 12 || length($user) < 4){
        $error[0] = 1;
    }
    if(length($email) > 25 || length($email) < 4){
        $error[1] = 1;
    }
    if(length($password) > 20 || length($password) < 7){
        $error[2] = 1;
    }
    if($password ne $repeat_password){
        $error[3] =  1;
    }
    my $user_check = $mysql::dbh->quote($user);
    my $mail_check = $mysql::dbh->quote($email);
    my $sth = $mysql::dbh->prepare("SELECT COUNT(*) FROM users WHERE user=".$user_check." OR email=".$mail_check);
    $sth->execute;
    our @resul = $sth->fetchrow_array;
    if($resul[0]){
        $error[4] = 1;
    }
    $password = md5($password);
    $password = $mysql::dbh->quote($password);
    $email = $mysql::dbh->quote($email);
    $user = $mysql::dbh->quote($user);
    unless(@error){
        $sth = $mysql::dbh->do("INSERT INTO users VALUES('', $user, $password, 'user', $email)");
    }
}
# Вывод различных ошибок регистрации(ещё не доделано)
if(@error){
    print "Ошибка";
}
print "<form action=\"#\" method=\"post\">\n";
print "Логин:\n";
print "<input type=\"text\" name=\"user\">\n";
print "<br>\n";
print "Пароль:\n";
print "<input type=\"password\" name=\"password\">\n";
print "<br>\n";
print "Повтор пароля: \n";
print "<input type=\"password\" name=\"repeat_password\">\n";
print "<br>\n";
print "E-mail:\n";
print "<input type=\"text\" name=\"e-mail\">\n";
print "<br>\n";
print "<input type=\"submit\" name=\"check\">\n";
print "</form>\n";

mysql таблица:

CREATE TABLE `users` (
  `id` bigint(20) NOT NULL auto_increment,
  `user` text,
  `password` text,
  `type` text,
  `email` text,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;

libperl/mysql.pm
#!/usr/bin/perl
use strict;
package mysql;
use DBI;
my $db = "base";
my $host = "localhost";
my $user = "root";
my $password = "";
$mysql::dbh = DBI->connect("DBI:mysql:database=$db;host=$host",
                      $user, $password, {RaiseError => 1});
$mysql::dbh->do("SET NAMES UTF8");

  Ответить  
 
 автор: winflip   (23.03.2009 в 11:07)   письмо автору
 
   для: winflip   (22.03.2009 в 15:29)
 

Вопрос актуален

  Ответить  
 
 автор: Trianon   (23.03.2009 в 11:18)   письмо автору
 
   для: winflip   (23.03.2009 в 11:07)
 

пример бы привели чтоли.... пароля, и его хеша.
Между прочим, в поле какого типа Вы храните этот хеш?

  Ответить  
 
 автор: winflip   (23.03.2009 в 13:59)   письмо автору
 
   для: Trianon   (23.03.2009 в 11:18)
 

Напримеи пароль 12344321 в базе вообще ничего нет, а если пароль tttttttt то в базе E и всё.
Поле типа text

  Ответить  
 
 автор: Trianon   (23.03.2009 в 14:05)   письмо автору
 
   для: winflip   (23.03.2009 в 13:59)
 

А какой хеш Вы ожидаете увидеть в базе при данном пароле?
Вообще-то хеш (в сыром виде) текстом не является.

  Ответить  
 
 автор: winflip   (23.03.2009 в 14:07)   письмо автору
 
   для: Trianon   (23.03.2009 в 14:05)
 

Ну не пустой же))))))

  Ответить  
 
 автор: Trianon   (23.03.2009 в 14:10)   письмо автору
 
   для: winflip   (23.03.2009 в 14:07)
 

Да почему не пустой?
Вы пытаетесь поместить в ячейку столбца таблицы БД значение явно не того типа, что сам столбец.
Само собой, что если СУБД сохранить это значение не может, в ячейке окажется пустое значение.

  Ответить  
 
 автор: winflip   (23.03.2009 в 14:11)   письмо автору
 
   для: Trianon   (23.03.2009 в 14:10)
 

Ну так какой тип. BLOB подойдёт?

  Ответить  
 
 автор: Trianon   (23.03.2009 в 14:17)   письмо автору
 
   для: winflip   (23.03.2009 в 14:11)
 

blob подойдет.
Хотя, на мой взгляд, разумнее воспользоваться одной из версий md5, которые кодируют результат
md5_hex
или если Вы так экономите память - md5_base64
blob не даст создать индекс на поле.
base64 займет всего на 4 байта больше blob

  Ответить  
 
 автор: Trianon   (23.03.2009 в 14:15)   письмо автору
 
   для: winflip   (23.03.2009 в 14:07)
 

К примеру, хеш пароля tttttttt представляет собой последовательность байт с кодами
45 FC AE AF D8 EB EC 14 BE CE 68 F7 F0 0C A1 54

45 - это код буквы E
а пара FC AE - не соответствует в кодировке UTF-8 ни одному действительному символу.

  Ответить  
 
 автор: winflip   (23.03.2009 в 14:18)   письмо автору
 
   для: Trianon   (23.03.2009 в 14:15)
 

Поняятно, просто я перепутал функции php и perl. PHP эквивалентна функции md5_hex в perl. И всё же какого типа поставить поле. Я так понял нужно бинарное. BLOB - это то что надо?

  Ответить  
 
 автор: Trianon   (23.03.2009 в 14:20)   письмо автору
 
   для: winflip   (23.03.2009 в 14:18)
 

md5_hex - это чисто текстовая строка из 32 байт.
тип поля char(32)

  Ответить  
 
 автор: winflip   (23.03.2009 в 14:22)   письмо автору
 
   для: Trianon   (23.03.2009 в 14:20)
 

char - это для md5_hex или просто md5??? Сам уже запутался.))))))

  Ответить  
 
 автор: winflip   (23.03.2009 в 14:28)   письмо автору
 
   для: winflip   (23.03.2009 в 14:22)
 

Всё с этим разобрался, спасибо за столь понятное объяснение))))

  Ответить  
 
 автор: Trianon   (23.03.2009 в 14:29)   письмо автору
 
   для: winflip   (23.03.2009 в 14:22)
 

попробуйте вывести на экран - сразу поймете.

  Ответить  
 
 автор: winflip   (23.03.2009 в 14:36)   письмо автору
 
   для: Trianon   (23.03.2009 в 14:29)
 

В общем ещё вопрос, в phpmyadmin поле char(32) а сранение какое ставить?

  Ответить  
 
 автор: Trianon   (23.03.2009 в 14:57)   письмо автору
 
   для: winflip   (23.03.2009 в 14:36)
 

любое

  Ответить  
 
 автор: winflip   (23.03.2009 в 15:01)   письмо автору
 
   для: Trianon   (23.03.2009 в 14:57)
 

Да но при авторизации при сравнении хэша полученнного из формы с хэшем в базе результатом запроса является 0. Т.е SELECT COUNT(*) FROM users WHERE password='".md5(param('password'))."'

  Ответить  
 
 автор: winflip   (23.03.2009 в 15:03)   письмо автору
 
   для: winflip   (23.03.2009 в 15:01)
 

Ну ещё функцией quote обрабатываю, просто громоздко здесь получится

  Ответить  
 
 автор: Trianon   (23.03.2009 в 15:07)   письмо автору
 
   для: winflip   (23.03.2009 в 15:01)
 

попробуйте вывести текст запроса и отладить его в PMA

  Ответить  
 
 автор: winflip   (23.03.2009 в 15:15)   письмо автору
 
   для: Trianon   (23.03.2009 в 15:07)
 

SELECT type, id FROM users WHERE user = 'winflip' AND password='e{&#65533;&#65533;r&#65533;y(&#65533;\"\'hA)S+' - Это текст запроса
Только в опере при выводе вместо кодов ромбы с вопросами

  Ответить  
 
 автор: winflip   (23.03.2009 в 15:18)   письмо автору
 
   для: winflip   (23.03.2009 в 15:15)
 

А это при добавлении записи
INSERT INTO users VALUES('', 'winflip', 'e{&#65533;&#65533;r&#65533;y(&#65533;\"\'hA)S+', 'user', 'win@mail.ru')

  Ответить  
 
 автор: winflip   (23.03.2009 в 15:19)   письмо автору
 
   для: winflip   (23.03.2009 в 15:18)
 

--
-- Структура таблицы `users`
--

CREATE TABLE `users` (
`id` bigint(20) NOT NULL auto_increment,
`user` text,
`password` char(32) default NULL,
`type` text,
`email` text,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 AUTO_INCREMENT=16 ;

--
-- Дамп данных таблицы `users`
--

INSERT INTO `users` VALUES (15, 'winflip', 'e{', 'user', 'win@mail.ru');

  Ответить  
 
 автор: Trianon   (23.03.2009 в 15:23)   письмо автору
 
   для: winflip   (23.03.2009 в 15:15)
 

Еще раз.
char(32) - тип, позволяющий хранить кодированный вариант md5_hex, а не сырой md5.
сырой md5 можно хранить только в blob

  Ответить  
 
 автор: winflip   (23.03.2009 в 15:38)   письмо автору
 
   для: Trianon   (23.03.2009 в 15:23)
 

Значит всёё таки запутался, щас попробую

  Ответить  
 
 автор: winflip   (23.03.2009 в 15:40)   письмо автору
 
   для: winflip   (23.03.2009 в 15:38)
 

Всё работает наконец то!!! Спасибо, trianon!!!

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

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