Существуют ли какие-либо проблемы безопасности, которые следует избегать при предоставлении системы входа в систему по электронной почте или по имени пользователя? - PullRequest
0 голосов
/ 23 мая 2010

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

Более конкретно, здесь уместная функция (функция query_row параметризует sql).

function authenticate($p_user, $p_pass) {
    $user        = (string)$p_user;
    $pass        = (string)$p_pass;
    $returnValue = false;

    if ($user != '' && $pass != '') {
        // Allow login via username or email.
        $sql = "SELECT account_id, account_identity, uname, player_id 
                FROM accounts 
                JOIN account_players ON account_id=_account_id 
                JOIN players ON player_id = _player_id 
                WHERE lower(account_identity) = lower(:login) 
                      OR lower(uname) = lower(:login) 
                      AND phash = crypt(:pass, phash)";
        $returnValue = query_row($sql, array(':login'=>$user, ':pass'=>$pass));

    }
    return $returnValue;
}

В частности, я добавил раздел WHERE lower(account_identity) = lower(:login) OR lower(uname) = lower(:login) ...etc, чтобы обеспечить изящную обратную совместимость для пользователей, которые не будут использовать свою электронную почту для процедуры входа в систему. Я не совсем уверен, что это OR безопасно, хотя. Есть ли способы, которыми я должен усилить безопасность кода php выше?

Ответы [ 2 ]

1 голос
/ 23 мая 2010

Что ж, после форматирования вашего запроса мне стало ясно, что ваше OR небезопасно.
Сделайте его

WHERE (lower(account_identity) = lower(:login) OR lower(uname) = lower(:login)) 
      AND phash = crypt(:pass, phash)";

Обратите внимание на скобки вокруг предложения OR.

0 голосов
/ 23 мая 2010

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

Что касается вашего кода, вы действительно должны сделать mysql_real_escape_string или подобное на $user, чтобы избежать внедрения SQL (если только функция query_row не сделает это за вас). Вы также можете убежать $pass, хотя там нет возможности сделать инъекцию, поскольку она будет хешироваться.

Насколько я знаю, утверждение OR не представляет особого вреда.

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