Я нахожусь в процессе перехода от системы "имя пользователя / пароль" к системе, которая использует электронную почту для входа в систему. Я не думаю, что есть какая-то ужасная проблема с разрешением электронной почты или имени пользователя для входа в систему, и я помню, что видел сайты, которые я считаю достаточно респектабельными, но также хотел бы знать о любых серьезных недостатках безопасности, которые я могу представлять.
Более конкретно, здесь уместная функция (функция 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 выше?