Проблема с md5 & mysql

Bueno

Новичок
Проблема с md5 & mysql

Всем привет!

У меня появилась проблемка с Логином на сайте:

Как всё работает:

Есть файлик на сервере для добавления пользователя на сайт в mysql

add_user.php

PHP:
function mksecret($len = 20) {
    $ret = "";
    for ($i = 0; $i < $len; $i++)
        $ret .= chr(mt_rand(0, 255));
    return $ret;
}

//$wantusername,$wantpassword - POST iz formi

$secret = mksecret();
$wantpasshash = md5($secret . $wantpassword . $secret);
$editsecret = mksecret();

//Tut mi polu4aem hash iz porola i sekreta i dobavlaem v bazu


$ret = mysql_query("INSERT INTO users (username, passhash, secret, editsecret, email, status, added) VALUES (" .
        implode(",", array_map("sqlesc", array($wantusername, $wantpasshash, $secret, $editsecret, $email, 'confirmed'))) .
        ",'" . get_date_time() . "')");
//Всё нормально добавляется но залогиниться не получается
login.php

//$username, $password - Post из формы
PHP:
$res = mysql_query("SELECT id, passhash, secret, username FROM users WHERE username = " . sqlesc($username) . "");
$row = mysql_fetch_array($res);

if ($row["passhash"] != md5($row["secret"] . $password . $row["secret"])) - И в этой проверке hash почемуто не совпадает с тем который был создан при регистрации, раньше проблем не было всё работало без проблем (Недавно перешел на unicode обновил софт сервера - может это как-то связанно)
bark(error);
Из-за чего может быть проблема?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Pingvin22
хеш md5 НЕ содержит в себе символы, которые нужно экранировать
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Скорее всего

if (ini_get('magic_quotes_gpc') == 1){
[m]stripslashes[/m]
}
 

Bueno

Новичок
Спасибо за ответы!

Но что за magic_quotes_gpc?

Где это нужно применить в коде который я писал?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
[m]phpinfo[/m]
[m]magic_quotes_gpc[/m]

-~{}~ 22.05.07 16:41:

Опоздал
 

Bueno

Новичок
magic_quotes_gpc - Включено

Установка magic_quotes для GPC (Get/Post/Cookie) операций. Когда magic_quotes включены (on), все ' (одиночные кавычки), " (двойные кавычки), \ (слэши) и ПУСТОТЫ экранируются с бэкслэшами автоматически.

Т.е мне надо отключить magic_quotes_gpc?

И получается что проблема в моменте передачи данных(POST,GET) на сервер?
 

Pingvin22

Новичок
Автор оригинала: Bueno
Т.е мне надо отключить magic_quotes_gpc?
Зачем отключать? Просто проверяй есло оно включено то делай стрипсласш если нет то нет.

Автор оригинала: Bueno И получается что проблема в моменте передачи данных(POST,GET) на сервер?
Как вариант..
 

Bueno

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

filipchuk

Новичок
пользуйся отладкой, смотри, что по твоему должно вставляться в базу, а что вставляеться на самом деле, там и найдеш ошибку
 

Bueno

Новичок
Разобрался с проблемой!

Проблема была в:

PHP:
function mksecret($len = 20) { 
    $ret = ""; 
    for ($i = 0; $i < $len; $i++) 
        $ret .= chr(mt_rand(0, 255)); 
    return $ret; 
}
Выдавала какие-то неизвестные символы. Возможно МУСКЛ не понимал и из за этого были несовпадения.

Решение:

PHP:
function mksecret($len = 20) { 
    $ret = ""; 
    for ($i = 0; $i < $len; $i++) 
        $ret .= chr(mt_rand(0, 255)); 
    return md5($ret); 
}
Всем спасибо за помощь!
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Bueno
Пароль в 32 символа?
Не многовато? :)
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Unkind
Я понимаю, что есть куча вариантов.
1. поле в БД размером в 8 символов...
2. Послеобработка пароля где-то внутри...

Но зачем эти все неясности и неточности...

Если объявляется в функции размер пароля (function mksecret($len = 20)), то выйти из ф-ции должен пароль объявленого размера.
 

Wicked

Новичок
Mr_Max
хеш md5 НЕ содержит в себе символы, которые нужно экранировать
не содержит, но ИМХО это не повод не экранировать. Потому что в один прекрасный прекрасный момент можно сменить хэш-функцию на другую (например, на тот же md5( , true)), и придется переделывать все места составления запросов. Поэтому я лично экранирурую все, что подается на вход запросов.

Pingvin22
Зачем отключать? Просто проверяй есло оно включено то делай стрипсласш если нет то нет.
если есть возможность отключить - лучше отключить. Потому что 100%й стрипслэшес требует недюженных усилий, и нередко является причиной DOS-атаки.
 
Сверху