Linux за българи: Форуми

Програмиране => Web development => Темата е започната от: Engelhertz в Nov 30, 2010, 18:30



Титла: php login форма
Публикувано от: Engelhertz в 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.        { ...


Титла: Re: php login форма
Публикувано от: VladSun в Nov 30, 2010, 18:47
Не виждам нещо грешно, следователно "грешката" е правилна - нямаш такива потребител/парола.
Разпечатай си заявката и виж дали в базата има такива данни.


Титла: Re: php login форма
Публикувано от: remotex в 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'


Титла: Re: php login форма
Публикувано от: gat3way в 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 с достатъчно голям брой итерации. Има много примери из нета.


Титла: Re: php login форма
Публикувано от: neter в Dec 02, 2010, 17:24
Понеже не използваш die към mysql_query (може би и в db_init() функцията), е възможно да пропуснеш евентуален проблем с връзката към базата данни или проблем в заявките, заради които проблеми musql_num_rows да връща нула (тъй като няма данни, подадени към него). Провери дали си описал всичко нужно и коректно във функцията db_init(), може да покажеш и какво съдържа, и добави die() с някакъв познавателен текст към заявките, за да видиш коя заявка не минава (ако има проблем със заявките) ;)