XBEHOLI
@XBEHOLI
back-end developer

Как поправить код?

Всем здравствуйте! На habr нашел вот такой пример создание регистрации/авторизации
Безопасный метод авторизации на PHP
В нем есть авторизации по hash`у. Нашел я в нём такой момент, что при авторизации добавляется/изменяется hash в базе + идет проверка хэша в профиле, но если пользователь авторизуется на другом устройстве, то хэш поменяется, значит логично, что на первом устройстве, профиль уже будет не доступен. Как поправить код, чтобы хэш менялся, но аккаунты везде оставались?

Если вам будет сложно перейти на habr, скину код сюда, вот:
<?

// Страница авторизации



# Функция для генерации случайной строки

function generateCode($length=6) {

    $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789";

    $code = "";

    $clen = strlen($chars) - 1;  
    while (strlen($code) < $length) {

            $code .= $chars[mt_rand(0,$clen)];  
    }

    return $code;

}



# Соединямся с БД

mysql_connect("localhost", "myhost", "myhost");

mysql_select_db("testtable");


if(isset($_POST['submit']))

{

    # Вытаскиваем из БД запись, у которой логин равняеться введенному

    $query = mysql_query("SELECT user_id, user_password FROM users WHERE user_login='".mysql_real_escape_string($_POST['login'])."' LIMIT 1");

    $data = mysql_fetch_assoc($query);

    

    # Соавниваем пароли

    if($data['user_password'] === md5(md5($_POST['password'])))

    {

        # Генерируем случайное число и шифруем его

        $hash = md5(generateCode(10));

            

        if(!@$_POST['not_attach_ip'])

        {

            # Если пользователя выбрал привязку к IP

            # Переводим IP в строку

            $insip = ", user_ip=INET_ATON('".$_SERVER['REMOTE_ADDR']."')";

        }

        

        # Записываем в БД новый хеш авторизации и IP

        mysql_query("UPDATE users SET user_hash='".$hash."' ".$insip." WHERE user_id='".$data['user_id']."'");

        

        # Ставим куки

        setcookie("id", $data['user_id'], time()+60*60*24*30);

        setcookie("hash", $hash, time()+60*60*24*30);

        

        # Переадресовываем браузер на страницу проверки нашего скрипта

        header("Location: check.php"); exit();

    }

    else

    {

        print "Вы ввели неправильный логин/пароль";

    }

}

?>

Хэш меняется при авторизации, ведь это не правильно :(
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 1
@eandr_67
web-программист (*AMP, Go, JavaScript, вёрстка).
Статья, мягко говоря, устарела много лет назад. Но даже в момент её создания такие вещи, как $password = md5(md5(trim($_POST['password']))); и setcookie("id", $data['user_id'], time()+60*60*24*30); были откровенным невежеством.

В современном PHP специально для хеширования и проверки паролей есть https://www.php.net/manual/ru/book.password.php, а куки используются только для хранения автоматически генерируемого интерпретатором PHP идентификатора сессии. Да и функции mysql_* выброшены из PHP несколько лет назад: есть только https://www.php.net/manual/ru/book.pdo.php и https://www.php.net/manual/ru/book.mysqli.php

Если нужно хранить факт авторизации и какую-либо информацию о пользователе (пусть даже его id) - для этого есть сессии PHP https://www.php.net/manual/ru/book.session.php и суперглобальный массив $_SESSION. И никаких user_hash в базе данных для этого вообще не нужно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы