Автор Тема: php login форма  (Прочетена 2805 пъти)

Engelhertz

  • Участници
  • ***
  • Публикации: 8
    • Профил
php login форма
« -: Nov 30, 2010, 18:30 »
здравейте , имам един много (поне за мен ) странен проблем с логин формата ми в php . проблема е ,че след върната заявка от sql  , mysql_num_rows връща резултат 0 .. защо се  получава това ?

Код
GeSHi (PHP):
  1. if (strlen($login)>4 && strlen($pass)>4)
  2.    {
  3.  
  4.         db_init(); //функция за връска с ЕС КУ ЕЛ бази данни
  5.         $rs= mysql_query ('SELECT * FROM users WHERE login="'.addslashes($login).'" AND pass="'.md5($pass).'"');
  6.     $t=mysql_fetch_assoc($rs); // Принципно неседи тук , сложих го само за тест
  7.  
  8.      var_dump ($rs); // resource(4) of type (mysql result)
  9.  
  10.      var_dump ($t); // bool(false)
  11.      echo '<br>';
  12.  
  13.      echo mysql_num_rows($rs); // 0
  14.  
  15.  
  16.       if (mysql_num_rows($rs)==1) // немога да мина тази проверка ...
  17.        { ...
« Последна редакция: Nov 30, 2010, 18:43 от VladSun »
Активен

VladSun

  • Moderator
  • Напреднали
  • *****
  • Публикации: 2166
    • Профил
Re: php login форма
« Отговор #1 -: Nov 30, 2010, 18:47 »
Не виждам нещо грешно, следователно "грешката" е правилна - нямаш такива потребител/парола.
Разпечатай си заявката и виж дали в базата има такива данни.
Активен

KISS Principle ( Keep-It-Short-and-Simple )
http://openfmi.net/projects/flattc/
Има 10 вида хора на този свят - разбиращи двоичния код и тези, които не го разбират :P

remotex

  • Напреднали
  • *****
  • Публикации: 344
    • Профил
Re: php login форма
« Отговор #2 -: Dec 01, 2010, 08:37 »
Преполагам че не става дума за стандартната таблица в mysql.users там отдавна не са md5 hashes а се ползва напр. следния SQL: "PASSWORD(".$pass.")" - предполагам $pass е в чист текст тука.
(дали ти е 32 символа дълго полето за мд5 в чист текст или е само 16 за бинарно съхраняване)
Дай резултата от :
Код
GeSHi (SQL):
  1. DESCRIBE users;
Също сложи една разпечатка на SQL заявката преди да я изпълниш защото имам чувството че си объркал SQL кавичките нещо с обикновени
т.е. май подаваш нещо като това
Код
GeSHi (SQL):
  1. SELECT * FROM users WHERE login="admin" AND pass="123456789a57a5a743894a0e4a801fc3"
вместо (правилното) това
Код
GeSHi (SQL):
  1. SELECT * FROM users WHERE login='admin' AND pass='123456789a57a5a743894a0e4a801fc3'
Активен

gat3way

  • Напреднали
  • *****
  • Публикации: 6050
  • Relentless troll
    • Профил
    • WWW
Re: php login форма
« Отговор #3 -: Dec 01, 2010, 09:43 »
Това в mysql.users никога не е било md5. mysql ползва два password hashing алгоритъма, единия до версия 4.1, другия оттам насетне, двата са достъпни чрез OLD_PASSWORD() и PASSWORD().

Първият (PASSWORD_OLD()) е хрумване на хората от mysql и е малоумен, има ред проблеми. Първият е че avalanche ефектът е много слаб и сходни низове дават сходни хешове. Вторият е че не е salt-нат, ако имаше повече интерес, щяха да се направят rainbow таблици, но пък не съм виждал засега. Третият е че алгоритъмът е простичък и не изисква особени изчислителни ресурси. Като резултат, трошенето на такива хешове е възможно най-проста задача, особено върху по-мощнички GPU-та с подходящият софтуер като hashcat примерно. Обикновено скоростта на кракване е поне няколко пъти по-голяма, в сравнение с md5, върху стари nvidia карти спокойно достига 1 милиард кандидата/секунда.

Вторият (PASSWORD()) представлява две последователни SHA-1 операции върху паролата, отново няма salt-ване. Avalanche ефектът си е ОК, операцията изисква доста повече изчислително време, но отново е напълно feasible да се пробваш да я bruteforce-неш върху GPU-та, освен което е възможно да се направят rainbow таблици, макар и никой да не му се занимава.


Недейте да използвате PASSWORD(), md5(), sha1() или тем подобни прости начини да си hash-вате паролите, защото е безотговорно. Дори и salt-натите варианти. Има доста по-сигурни начини, като PHPASS на Solar Designer (който се изплзва примерно от wordpress или phpbb3). Или пък PBKDF2 с достатъчно голям брой итерации. Има много примери из нета.
Активен

"Knowledge is power" - France is Bacon

neter

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 3408
  • Distribution: Debian, SailfishOS, CentOS
  • Window Manager: LXDE, Lipstick
    • Профил
    • WWW
Re: php login форма
« Отговор #4 -: Dec 02, 2010, 17:24 »
Понеже не използваш die към mysql_query (може би и в db_init() функцията), е възможно да пропуснеш евентуален проблем с връзката към базата данни или проблем в заявките, заради които проблеми musql_num_rows да връща нула (тъй като няма данни, подадени към него). Провери дали си описал всичко нужно и коректно във функцията db_init(), може да покажеш и какво съдържа, и добави die() с някакъв познавателен текст към заявките, за да видиш коя заявка не минава (ако има проблем със заявките) ;)
Активен

"Да си добре приспособен към болно общество не е признак за добро здраве" - Джиду Кришнамурти