Вход в систему пользователей, избегая отмены учетных записей пользователей? - PullRequest
1 голос
/ 21 июня 2011

Факты:

  1. Пользователи нашей системы могут войти через свой адрес электронной почты и пароль.
  2. Адреса электронной почты являются уникальным идентификатором, но если учетная запись отменяется, другой человек может зарегистрироваться с тем же адресом электронной почты. Предыдущая запись остается в нашей системе.
  3. Если отмененный пользователь пытается войти, мы не должны разрешать ему доступ.

Теперь, когда проверяется, существует ли запись при входе в систему пользователя, правильно ли делать следующее?

$rs=$DBobject->execute_query("select * from users where `email`='".$email."' and `password`='".passwordMD5($password)."' and status!='cancelled'");
if($DBobject->my_num_rows($rs)>0)
{
    // login the user
}
else
{
    // check if account has been cancelled 
    $rs_cancelled=$DBobject->execute_query("select id from users where `email`='".$email."' and `password`='".passwordMD5($password)."' and status='cancelled'");
    if($DBobject->my_num_rows($rs_cancelled)>0)
    {
        return "Your account has been cancelled";
    }
    else
    {
        return "Invalid email/password";
    }
}

Меня особенно беспокоит тот факт, что мы используем пароль для уникальной идентификации записи (в $rs_cancelled) - может ли это быть использовано в гнусных целях? Как можно подорвать процесс выше?

Ответы [ 3 ]

2 голосов
/ 21 июня 2011

Если переменные, входящие в ваши запросы, не санированы где-то, чего мы не видим, любой ребенок с помощью SQL-инъекции tool . * Может подорвать его за минуты1005 *

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

Кроме того, этот код является расточительным.Как насчет этого:

// WARNING -- WARNING -- HERE PROBABLY BE SQL INJECTIONS
$rs=$DBobject->execute_query(
    "select * from users where `email`='".$email."' and password`='".passwordMD5($password)."'");

// Is there such a user?
if($DBobject->my_num_rows($rs) == 0) {
    return "Invalid email/password";
}

// Now fetch the record from $rs -- I don't know how your code does this,
// but let's assume:
$row = $rs->getRow();

// Now check if the user is cancelled
if ($row['status'] == 'cancelled') {
    return "Your account has been cancelled";
} 

// Login the user, since the account exists and is not cancelled

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

0 голосов
/ 21 июня 2011

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

0 голосов
/ 21 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...