Алгоритмы проверки логина - PullRequest
0 голосов
/ 15 апреля 2011

Я знаю об одном -

SELECT * FROM log_records WHERE 'username'=uname AND 'password'=pass;
if(row_count==1)
    return true;
return false;  

Вопросы:

  • Является ли приведенный выше алгоритм «наилучшей практикой»?
  • Есть ли альтернативы?по вышеуказанному алгоритму?

Спасибо!

Ответы [ 4 ]

4 голосов
/ 15 апреля 2011

Это НЕ лучшая практика.

  • Во-первых, он будет работать только в том случае, если имя пользователя и пароль не будут зашифрованы.
  • Во-вторых, это безнадежно уязвимо для SQL-инъекций, и я мог бы украсть все ваши пользовательские учетные данные примерно за 3 секунды с этим оператором SQL.

Начните здесь с рекомендаций: https://www.owasp.org/index.php/Guide_to_Authentication

Лучше всего использовать существующего поставщика членства для любой среды, в которой вы разрабатываете, а не создавать свою собственную, или еще лучше, с использованием OpenID или аналогичного механизма.

Даже если статья OWASP слишком глубока, ПОЖАЛУЙСТА, по крайней мере, прочитайте это: http://www.codinghorror.com/blog/2008/05/openid-does-the-world-really-need-yet-another-username-and-password.html

и это: http://www.codinghorror.com/blog/2007/09/youre-probably-storing-passwords-incorrectly.html

Последнее редактирование

Это статья, которую я ДЕЙСТВИТЕЛЬНО искал, когда нашел эти два выше: http://www.codinghorror.com/blog/2010/12/the-dirty-truth-about-web-passwords.html

0 голосов
/ 18 июня 2016

Я использую этот псевдокод.

  • начало
    • Дезинфицировать входы
    • проверить имя пользователя, если существует
    • получить пароль пользователя, если существует
    • при использовании шифрования зашифруйте введенный пароль
    • сравнить пароль пользователя с введенным паролем
    • сделать что-нибудь
  • конец
0 голосов
/ 15 апреля 2011

Это верный способ сделать это. Он не включен в ваш пост, но я полагаю, что пароль является зашифрованной версией действительного пароля?

Вышеприведенное утверждение требует, чтобы имя пользователя было уникальным, но обычно это так.

Дополнительное замечание: в приведенном выше заявлении не обязательно учитывается регистр. Некоторые базы данных сравнивают текстовые данные в текстовом формате, а не в битовом формате. Это будет означать, что вход в систему с паролем «MyPasSworD» будет работать, но «mypassword» будет работать также.

0 голосов
/ 15 апреля 2011

Вы могли бы сделать это ...

SELECT `id`, `password` FROM `log_records` WHERE `username` = uname

Предполагая, конечно, что uname связан или экранирован через правильный механизм экранирования.

Если строк нет, вы бы зналипользователь не существует.

После этого вы можете сравнить пароль, введенный пользователем, с паролем для этого пользователя.

Затем вы можете внутренне записать данные этого неудачного входа в систему.

Помните, не говорите конечному пользователю, который потерпел неудачу.Используйте что-то общее, например . Имя пользователя и / или пароль не совпадают с .

.
...