Когда пользователи заходят на сайт - мне выбирать по имени пользователя и паролю или просто по имени пользователя? - PullRequest
2 голосов
/ 12 мая 2011

Я использую PHP и mySQL на сайте, который я проектирую с нуля.

Когда пользователь входит на сайт, я должен:

  • сделать запрос WHERE username='username' AND password='password', в этом случае мне нужно проиндексировать поля имени пользователя и пароля, и я могу вернуть «Неправильный логин», если одна из деталей неверна

или

  • Makeтолько запрос WHERE username='username', в этом случае мне нужно индексировать только поле имени пользователя, но нужно проверить, совпадают ли пароли в коде на стороне сервера

?


ОБНОВЛЕНИЕ:
Этот вопрос о хорошей практике.Речь идет о том, могут ли плюсы добавить индекс в поле пароля, чтобы я мог получить ответ от БД, только если обе детали верны, перевешивает минусы пространства и размера, который займет этот индекс.
Надеюсьне думаю, что специфические для моей системы (кроме языка программирования и типа БД) актуальны и помогут.

Ответы [ 5 ]

0 голосов
/ 12 мая 2011

Я бы предпочел последнее по следующим причинам:

  • Возможно, вы захотите сохранить (неудачные) попытки входа в базу данных, для этого вам нужна запись пользователя независимо от(in) правильный пароль.

  • Вы должны хэшировать свои пароли, и вы можете захотеть реализовать алгоритм хэширования только в одном месте (например, ваш PHP-код).Если ваш алгоритм изменится, по крайней мере, вам не нужно изменять ваш код и SQL-запрос.Например:

    класс User {

    protected $ username;защищенный $ password_hash;защищенный $ salt;

    защищенная функция hashPassword ($ password) {return md5 ($ this-> salt. $ password);}

    публичная функция checkPassword ($ password) {return ($ this-> hashPassword ($ password) == $ this-> password_hash);}

}

0 голосов
/ 12 мая 2011

Вы не предоставляете много подробностей, но в целом я выбираю второй вариант. Он позволит вам делать такие вещи, как пометка пользователя после N попыток войти в систему с неверным паролем.

Да, и, конечно же, не забудьте хранить ваши пароли в хэш-форме с правильной случайной солью, а не в виде простого текста.

0 голосов
/ 12 мая 2011

Первый способ лучше, чем во втором, если имя пользователя совпадает, тогда вам придется снова сделать запрос для проверки пароля

0 голосов
/ 12 мая 2011

Я бы сделал последнее (имя пользователя - «то, что вы ищете», даже если вы делаете явную проверку пароля на каком-то этапе), но невозможно придумать для вас индивидуальный ответ, без глубокое знакомство с вашей конкретной кодовой базой.

Редактировать

Вы упоминаете индексацию; индексирование и поля имени пользователя и пароля имеет смысл только тогда, когда username не является уникальным .. и так и должно быть. Так что это спорный вопрос.

0 голосов
/ 12 мая 2011

если в вашем предложении sql сначала указано имя пользователя = 'username', то, я думаю, вы не получите штраф за производительность в поле пароля.

Я не знаю этого наверняка, ноя знаю, что в языках программирования никто не будет оценивать другие операторы в цепочке AND, если первый оператор возвращает ложь.

if(iAlwaysReturnFalse() && soIWontGetEvaluated()){
  System.out.println("I never get printed out :( ");
}

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

SELECT * FROM user WHERE username = '...' and password = '...' 

работает против

SELECT * FROM user WHERE password = '....' and username = '...' 

и против

SELECT * FROM user WHERE username = '...'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...