Логика на стороне сервера входа - PullRequest
0 голосов
/ 28 сентября 2011

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

Сейчас у меня настроено, где мой sql-запрос сканирует базу данных как для пользователя, так и для передачи:

SELECT * FROM test WHERE userName='" + userName + "' AND pass='" + password + "'"

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

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

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

Ответы [ 2 ]

1 голос
/ 28 сентября 2011

Я понятия не имею, поддерживается ли хранимая процедура в моем SQL или нет.Если это поддерживается, вы можете сделать так, чтобы SP проверял все случаи.Ниже приведен код для MSSQL, вы можете проверить его с помощью моего sql:

IF EXISTS(SELECT [id] FROM [dbo].[users] WHERE [user_name] = @user_name AND [password] = @password)
BEGIN
    SELECT 1 AS RETURNVAL  --Valid User         
END
ELSE IF NOT EXISTS(SELECT [id] FROM [dbo].[users] WHERE [user_name] = @user_name)
BEGIN
    SELECT 0 AS RETURNVAL  -- User doesn't exist
END
ELSE 
BEGIN
    SELECT -1 AS RETURNVAL  -- Password Not Correct
END
0 голосов
/ 28 сентября 2011

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

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

Несоответствие имени пользователя и / или пароля.

В качестве отступления используйте подготовленные операторы , а не конкатенацию строк при работе с вашей базой данных; он защищает вас от атак SQL-инъекций. Плюс - хотя это не совсем ясно из вашего фрагмента кода - не храните простые пароли или хэши простых паролей. Положитесь на одну из многих доступных и хорошо протестированных библиотек шифрования / хеширования, например, PHP-функция crypt (убедитесь, что вы выбрали правильную функцию хеширования, такую ​​как SHA512).

Ваш код в самой простой форме будет выглядеть так:

// coming from your login page
$dbh = new PDO(…);
$sth = $dbh->prepare('SELECT `digest` FROM `users` WHERE `name` = :name LIMIT 1');
$sth->prepare(array( ':name' => $_POST['username'] ));
$result = $sth->fetch();

if($result !== FALSE && crypt($_POST['password'], $result['digest']) === $result['digest']) {
  printf('You logged in successfully as %s', htmlspecialchars($_POST['username']));
} else {
  echo 'Sorry, username and/or password did not match! Please try again.';
  sleep(1);
  exit;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...