Ошибка авторизации

Romashov

экспериментатор
Ошибка авторизации

В чём проявляется:
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();};
        };
//в противном случае сохранятся дефолты
-~{}~ 07.04.05 10:32:

Понимаю, что код сильно большой, чтобы его смотреть, привёл его только для того, чтобы могли подтвердить свои мысли по проблеме, описанной выше
 

Romashov

экспериментатор
Понимаю, что это лишнее, но, к сожалению, это проблему не решает.
 

Фанат

oncle terrible
Команда форума
да, в общем-то, я и не имел в виду, что решает.
это я так просто - понравилось.
это, как бы, очевидно, что постами на форуме проблемы не решают.
а решают отладкой своего скрипта.
 

Romashov

экспериментатор
Эт, понятно, что отладкой.
Но когда это всё лажено, перелажено- одна надежда остаётся, что кто-нибудь с подобным сталкивался, или знает с чем это может быть связано.
Потому и справшиваю.
 

Фанат

oncle terrible
Команда форума
когда это всё лажено, перелажено
ой, правда штоли?
и какая же информация получена в процессе отладки - можно полюбопытствовать?
Какие значения ключевых переменных, НТТР заголовков, в случае, когда авторизация не проходит?
кто-нибудь с подобным сталкивался
с подобным ЧЕМ? можно формулировочку?
сталкивался с тем, что "иногда авторизация не работает"?
ну я сталкивался.
только моя авторизация не имеет ничего общего с твоим кодом и с твоими условаиями.
 

Romashov

экспериментатор
Вход под другим ником - это я знаю со слов пользователей
Авторизация не получается - когда пароль состоит из цифр (100%)
Авторизация вылетает, несмотря на правильно стоящие куки.
Какие значения ключевых переменных, НТТР заголовков, в случае, когда авторизация не проходит?
На таком уровне отладку не проводил.
Можно сказать, провёл тестирование (на локалке экстренные ситуации) и в бою под 1 100 пользователями.
 

Фанат

oncle terrible
Команда форума
это значит не "на таком уровне", а вообще не проводил.
И добро бы - если бы ошибка плохо отлавилвалась. писать логи - это на 5 строчек кода больше, чем напрямую отлаживать.
Но с цифрами-то хотя бы мог разобраться? В КАКОЙ ИМЕННО МОМЕНТ, в какой строке скрипта алгоритм даёт сбой?
какая проблема запускать скрипт, выводя все переменные на экран и контролируя визуально?

почему 100% программистов так делает, когда сталкивается с неправильной работой программы, а ты идёшь на форкм, чтобы тебе отгадали?

PHP FAQ: Ничего не работает! Что делать??? - читай, делай, как там сказано
 

Romashov

экспериментатор
В том-то и дело, что на локальном компе всё работает как часы. Из 100 тестов - 100 правильно.
На сервере под нагрузкой - глюки.
 

Romashov

экспериментатор
Коим образом -
PHP:
for($user['skill']="lamer";$user['skill']=="xakep";$user['skill']++) check_security_please();
foreach($all_users as $value)show_my_own_bags();
Дело в том, что сайт уже под нагрузкой.
И выводить ошибки невозможно - лог ошибок чистый (проверял)
SQL возвращает всё что нужно.
Выводить все переменные?
 

Фанат

oncle terrible
Команда форума
И выводить ошибки невозможно
с какой это радости?
кто тебе мешает написать функцию
mydebug($var) {
if($_SERVER['REMOTE_ADDR']=='твой.айпи') {
echo "<pre>";
var_dump($var);
echo "</pre>";
}
}
и единственному наслаждаться выводом нужных сообщений?
лог ошибок чистый (проверял)
ТАК ПОЧЕМУ ОН ЧИСТЫЙ??? если ТЫ должен в него ПИСАТЬ отладочную информацию???
 

Romashov

экспериментатор
Он выдаст значения только для меня, в то время как глюки бывают у многих юзеров, а у меня относительно редко.
Я подозреваю, что в логике моего модуля авторизации есть ошибка, но найти её не могу.
 

Фанат

oncle terrible
Команда форума
а у меня относительно редко
Авторизация не получается - когда пароль состоит из цифр (100%)
подсудимый.
Вы путаетесь в показаниях.
если ты не соврал ранее про стопроцентов, то кто тебе мешает завести тестового пользователя с цифрами?
если соврал - то кто тебе мешает по факту срыва авторизации скидывать в лог максимальное количество информации о стостоянии скрипта - квери стринг, куки, НТТР заголовки, sql запросы, значения переменных?

Я подозреваю, что в логике моего модуля авторизации есть ошибка, но найти её не могу.
И чего ты таки уже хочешь? чтобы кто-то сделал это за тебя?
 

Romashov

экспериментатор
Относительно редко для меня случается более важная проблема - авторизация под чужим ником и вылетание.
Для меня это первое происходит 1 раз из 150 случаев, второе - каждый 20 раз.
Для других чаще, и это опасно (модер. панель незащищена).
Цифровой пароль - спасибо, я разобрался в чём дело.
 

Фанат

oncle terrible
Команда форума
ну что ж - я думаю, что вооружённый моими советами, ты легко разберёшься с остальными проблемами.
иоли у тебя какие-то другие вопросы остались?
 

Romashov

экспериментатор
Спасибо за урок и вооружение :)
Остались.
Что со стороны сервера может препятствовать обмену заголовками и куками?(какое-нибудь серверное кэширование, например)
Что в моём блоке авторизации некрасиво или неправильно? (глаз у Вас опытный, думаю, что если что-то и есть, то заметите с первого взгляда).
Заранее спасибо.
 

Фанат

oncle terrible
Команда форума
Ну, на мой взгляд, вся авторизация очень длинно написана.
Сам я не люблю писать одноразовые функции, предпочитая обходиться управляющими структурами.
очень много дублей.
к примеру - почему бы не получать фулл юзер инфо сразу при проверке логина и пароля?
я бы делал просто
сначала блок
if(isset($_GET['action']) AND $_GET['action']=="logout" )
внутри которого код от функции goobgYe и после него - обязательный exit и редирект.
а дальше - проверка, имеем ли мы пароль в куках. если имеем переменным присваиваются логин и проль.
если имеем в посте - присваиваются из поста.
дальше проверка, и по её результатам либо пускаем, либо редиректим.
если был пост - то тоже редиректим
 

Romashov

экспериментатор
А зачем после поста редиректить- чтобы всё осталось в куках?
 

Фанат

oncle terrible
Команда форума
редирект не имеет никакого отношения к авторизации.
его просто нао делать.
после поста - по очевидным причинам.
после логаута - чтобы в адресной строке не остался хвост с логаутом.
 
Сверху