Какой метод лучше проверять учетные данные пользователя?

Должен ли я проверять имя пользователя и передавать слово, ища оба в таблице SQL. Или Должен ли я найти имя пользователя, а затем совместить это слово с инструкцией PHP if?

  1. SELECT * FROM table WHERE username = $username AND password =$password

  2. SELECT * FROM table WHERE username = $username

    if ($row[password] == $password) { do stuff }

Какой метод более безопасен и эффективен?

Solutions Collecting From Web of "Какой метод лучше проверять учетные данные пользователя?"

Дело в том … Вы должны хранить соленые, хешированные пароли в базе данных. Поскольку они индивидуально соленые на пользователя / пароль, вы не можете искать их напрямую с помощью password = ? , потому что вы не знаете соль и, следовательно, не можете заранее рассчитать соответствующий хеш. Если вы делаете это правильно, вы должны сначала забрать пользовательскую запись по имени пользователя, а затем проверить хэш пароля, используя извлеченную соль / хеш. псевдокод:

 $user = fetch_from_database($_POST['username']); if (!$user) { throw new Exception("User doesn't exist"); } if (!password_verify($_POST['password'], $user['password_hash'])) { throw new Exception('Invalid password'); } echo 'Welcome ', $user['name']; 

См. http://php.net/password_hash , http://php.net/password_verify .

Из вышеперечисленного 2 второй является более безопасным, поскольку первый из них более склонен к SQL-инъекции.

 SELECT * FROM table WHERE username = $username AND password =$password 

В этом коде, если введенное значение имени пользователя и пароля является чем-то вроде «a или ('a' = 'a'),« код будет изменен на

 SELECT * FROM table WHERE username = a or ('a' = 'a') AND password = a or ('a' = 'a') 

Это означает четкий код для перечисления всех ваших данных.

Если во втором случае условие IF будет рассматривать значение только как одну строку. Так что второе – лучшее среди упомянутых 2-х.

Надеюсь это поможет