Должен ли я проверять имя пользователя и передавать слово, ища оба в таблице SQL. Или Должен ли я найти имя пользователя, а затем совместить это слово с инструкцией PHP if?
SELECT * FROM table WHERE username = $username AND password =$password
SELECT * FROM table WHERE username = $username
…
if ($row[password] == $password) { do stuff }
Какой метод более безопасен и эффективен?
Дело в том … Вы должны хранить соленые, хешированные пароли в базе данных. Поскольку они индивидуально соленые на пользователя / пароль, вы не можете искать их напрямую с помощью 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-х.
Надеюсь это поможет