|
|
|
| Добрый день уважаемые форумчане.
Вопрос к знающим perl.
В общем есть база, таблицы - всё это в кодировке utf8. Хэширую пароль в md5, не md5_hex, не md5_base64 и при добавлении в базу поосле обработки функцией quote модуля DBI. В базе остаётся нечто не похожее: либо e{ либо вообще ничего, в общем на хэш не похожее. Проблема появилась ВОЗМОЖНО после изменения кодировки, хотя связи почти не вижу. При подключении делаю запрос SET NAMES UTF8. | |
|
|
|
|
|
|
|
для: winflip
(22.03.2009 в 14:52)
| | Вы яснее пишите, а то увидев "вопрос к знающим perl", я решил что речь идет о виде массивов... | |
|
|
|
|
|
|
|
для: 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: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
(22.03.2009 в 15:29)
| | Вопрос актуален | |
|
|
|
|
|
|
|
для: winflip
(23.03.2009 в 11:07)
| | пример бы привели чтоли.... пароля, и его хеша.
Между прочим, в поле какого типа Вы храните этот хеш? | |
|
|
|
|
|
|
|
для: Trianon
(23.03.2009 в 11:18)
| | Напримеи пароль 12344321 в базе вообще ничего нет, а если пароль tttttttt то в базе E и всё.
Поле типа text | |
|
|
|
|
|
|
|
для: winflip
(23.03.2009 в 13:59)
| | А какой хеш Вы ожидаете увидеть в базе при данном пароле?
Вообще-то хеш (в сыром виде) текстом не является. | |
|
|
|
|
|
|
|
для: Trianon
(23.03.2009 в 14:05)
| | Ну не пустой же)))))) | |
|
|
|
|
|
|
|
для: winflip
(23.03.2009 в 14:07)
| | Да почему не пустой?
Вы пытаетесь поместить в ячейку столбца таблицы БД значение явно не того типа, что сам столбец.
Само собой, что если СУБД сохранить это значение не может, в ячейке окажется пустое значение. | |
|
|
|
|
|
|
|
для: Trianon
(23.03.2009 в 14:10)
| | Ну так какой тип. BLOB подойдёт? | |
|
|
|
|
|
|
|
для: winflip
(23.03.2009 в 14:11)
| | blob подойдет.
Хотя, на мой взгляд, разумнее воспользоваться одной из версий md5, которые кодируют результат
md5_hex
или если Вы так экономите память - md5_base64
blob не даст создать индекс на поле.
base64 займет всего на 4 байта больше blob | |
|
|
|
|
|
|
|
для: 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 ни одному действительному символу. | |
|
|
|
|
|
|
|
для: Trianon
(23.03.2009 в 14:15)
| | Поняятно, просто я перепутал функции php и perl. PHP эквивалентна функции md5_hex в perl. И всё же какого типа поставить поле. Я так понял нужно бинарное. BLOB - это то что надо? | |
|
|
|
|
|
|
|
для: winflip
(23.03.2009 в 14:18)
| | md5_hex - это чисто текстовая строка из 32 байт.
тип поля char(32) | |
|
|
|
|
|
|
|
для: Trianon
(23.03.2009 в 14:20)
| | char - это для md5_hex или просто md5??? Сам уже запутался.)))))) | |
|
|
|
|
|
|
|
для: winflip
(23.03.2009 в 14:22)
| | Всё с этим разобрался, спасибо за столь понятное объяснение)))) | |
|
|
|
|
|
|
|
для: winflip
(23.03.2009 в 14:22)
| | попробуйте вывести на экран - сразу поймете. | |
|
|
|
|
|
|
|
для: Trianon
(23.03.2009 в 14:29)
| | В общем ещё вопрос, в phpmyadmin поле char(32) а сранение какое ставить? | |
|
|
|
|
|
|
|
для: winflip
(23.03.2009 в 14:36)
| | любое | |
|
|
|
|
|
|
|
для: Trianon
(23.03.2009 в 14:57)
| | Да но при авторизации при сравнении хэша полученнного из формы с хэшем в базе результатом запроса является 0. Т.е SELECT COUNT(*) FROM users WHERE password='".md5(param('password'))."' | |
|
|
|
|
|
|
|
для: winflip
(23.03.2009 в 15:01)
| | Ну ещё функцией quote обрабатываю, просто громоздко здесь получится | |
|
|
|
|
|
|
|
для: winflip
(23.03.2009 в 15:01)
| | попробуйте вывести текст запроса и отладить его в PMA | |
|
|
|
|
|
|
|
для: Trianon
(23.03.2009 в 15:07)
| | SELECT type, id FROM users WHERE user = 'winflip' AND password='e{��r�y(�\"\'hA)S+' - Это текст запроса
Только в опере при выводе вместо кодов ромбы с вопросами | |
|
|
|
|
|
|
|
для: winflip
(23.03.2009 в 15:15)
| | А это при добавлении записи
INSERT INTO users VALUES('', 'winflip', 'e{��r�y(�\"\'hA)S+', 'user', 'win@mail.ru') | |
|
|
|
|
|
|
|
для: 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'); | |
|
|
|
|
|
|
|
для: winflip
(23.03.2009 в 15:15)
| | Еще раз.
char(32) - тип, позволяющий хранить кодированный вариант md5_hex, а не сырой md5.
сырой md5 можно хранить только в blob | |
|
|
|
|
|
|
|
для: Trianon
(23.03.2009 в 15:23)
| | Значит всёё таки запутался, щас попробую | |
|
|
|
|
|
|
|
для: winflip
(23.03.2009 в 15:38)
| | Всё работает наконец то!!! Спасибо, trianon!!! | |
|
|
|