Romashov
экспериментатор
Ошибка авторизации
В чём проявляется:
1. Иногда при входе на сайт (http://djv.ru) авторизация не проходит, хотя куки стоят верные.
2. Иногда авторизация проходит, но вход идёт под другим ником.
3. У некоторых пользователей (возможно, у тех, у которых числовой пароль) авторизация не проходит вообще.
4. В остальных случаях - всё ОК.
Из-чего могут возникать такие проблемы? Была ли такая ошибка и у вас, и где она может быть?
Код модуля авторизации (в БД пароль хранится в зашифрованном (md5) виде).
-~{}~ 07.04.05 10:32:
Понимаю, что код сильно большой, чтобы его смотреть, привёл его только для того, чтобы могли подтвердить свои мысли по проблеме, описанной выше
В чём проявляется:
1. Иногда при входе на сайт (http://djv.ru) авторизация не проходит, хотя куки стоят верные.
2. Иногда авторизация проходит, но вход идёт под другим ником.
3. У некоторых пользователей (возможно, у тех, у которых числовой пароль) авторизация не проходит вообще.
4. В остальных случаях - всё ОК.
Из-чего могут возникать такие проблемы? Была ли такая ошибка и у вас, и где она может быть?
Код модуля авторизации (в БД пароль хранится в зашифрованном (md5) виде).
PHP:
$user=array(
"id"=>"0",
"nick"=>"",
"password"=>"",
"group"=>"guest",
"rules"=>"0",
"banned"=>"0",
"fio"=>""
);
$default_user=$user;
/*сбрасываем настройки какие-бы они не были до нуля, создаём дефолтного пользователя*/
function login_ok($nick,$password)
//проверка правильного пароля и логина
{
global $dbh;//указатель на соединение с БД
$k=0;
$nick=addslashes(htmlspecialchars($nick));
$password=addslashes(htmlspecialchars($password));
$res=mysql_query("SELECT `nick` FROM `users` WHERE `nick`='$nick' AND `password`='$password' AND `banned`='0' LIMIT 1;",$dbh);
//логин тот, пароль тот, не забанен
$h=mysql_fetch_array($res);
if($h['nick']===$nick){
$k=1;//авторизация успешна
};
return $k;
};
function goodbue(){//пользователю надо выйти
global $user,$default_user;
setcookie("password","32323dr",1);
setcookie("login","32323dr",1);//сбросили куки
$user=$default_user;//сделали его гостем
};
$k=0;
if(isset($_GET['action']) AND $_GET['action']=="logout" ){goodbue();$k=1;};
//если он прошёл по ссылке [url]http://djv.ru/?action=logout[/url]
function full_user_info($user_array,$user_nick)
/*функция получения инфы о юзере из БД (на время работы
скрипта все его данные хранятся в $user[], и используются*/
{
global $dbh;
$user_nick=addslashes($user_nick);
$res=mysql_query("SELECT * FROM `users` WHERE `nick`='$user_nick' LIMIT 1;",$dbh);
if($h=mysql_fetch_array($res))
{
$user_array=$h;
};
return $user_array;//возврат - гость или авторизированный, полный массив данных
};
if(isset($_COOKIE['login'],$_COOKIE['password']) AND !$k){
//у пользователя есть наши куки, проверим их
if(login_ok($_COOKIE['login'],$_COOKIE['password']))
//надо обновить информацию, они верны
{$user=full_user_info($user,$_COOKIE['login']);}
else{goodbue();};
//больше куки не будем обновлять
};
if(isset($_POST['login'],$_POST['password']) AND !$k){
//пользователь авторизуется через форму
//однозначная проверка и обновление, несмотря на куки
if(login_ok($_POST['login'],md5($_POST['password'])))
//надо обновить информацию
{$user=full_user_info($user,$_POST['login']);
//а также поставим куки
setcookie("login",$_POST['login'],time()+3600*24*365);
setcookie("password",md5($_POST['password']),time()+3600*24*365);}//на год
else{goodbue();};
};
//в противном случае сохранятся дефолты
Понимаю, что код сильно большой, чтобы его смотреть, привёл его только для того, чтобы могли подтвердить свои мысли по проблеме, описанной выше