За последние 24 часа нас посетил 21621 программист и 1060 роботов. Сейчас ищут 692 программиста ...

Проблема с авторизацией

Тема в разделе "Прочие вопросы по PHP", создана пользователем senn, 20 янв 2018.

  1. senn

    senn Новичок

    С нами с:
    20 янв 2018
    Сообщения:
    5
    Симпатии:
    0
    Всем привет.
    Решил сделать авторизацию на сайте следующим образом:
    На странице enter.php пользователь вводит логин и пароль, после нажатия кнопки переходит на страницу entercheck.php, на которой проверяется, все ли поля заполнены, есть ли такой пользователь в базе данных, если пользователь есть, то введенный пароль соответствует тому, что есть в базе.
    Если не все поля заполнены, то переменная $_SESSION['servicemessage']=1;
    Если пользователя нет в базе, то переменная $_SESSION['servicemessage']=2;
    Если пароль не совпадает, то переменная $_SESSION['servicemessage']=3;
    Если все хорошо, то переменная $_SESSION['servicemessage']=4.
    Далее осуществляется редирект на страницу servicepage.php, на которой происходит определенное действие, в зависимости от значения переменной $_SESSION['servicemessage']:
    $_SESSION['servicemessage']=1 - на странице пишется "не все поля заполнены";
    $_SESSION['servicemessage']=2 - на странице пишется "такого пользователя нет";
    $_SESSION['servicemessage']=3 - на странице пишется "неверный пароль";
    $_SESSION['servicemessage']=4 - на странице пишется "вы успешно авторизованы".

    После переменная $_SESSION['servicemessage'] обнуляется и при входе на страница servicepage.php происходит редирект на главную страницу (т.е. просто так эту страницу пользователь не увидит).
    Все работает как надо, кроме "неверный пароль". Почему то в этом случае скрипт иногда работает, а иногда просто так редиректит на главную. Никакой закономерности не вижу. Может 3 раза сработать правильно, потом 1 неправильно, потом 1 правильно, 2 - неправильно и т.д. и т.п.

    Вот фрагмент файла entercheck.php:

    PHP:
    1. if (empty($email) or empty($password))
    2. {
    3.    $_SESSION['servicemessage']=1;
    4.    header('Location: https://mydomain.ru/servicepage');
    5.    exit;
    6. }
    7.  
    8. $email = stripslashes($email);
    9. $email = htmlspecialchars($email);
    10. $email = trim($email);
    11. $password = stripslashes($password);
    12. $password = htmlspecialchars($password);
    13. $password = trim($password);
    14.    
    15. include('dbconnect.php');
    16. $result = mysql_query("SELECT * FROM `users` WHERE `email`='$email'");
    17. $myrow = mysql_fetch_array($result);
    18.  
    19. if (empty($myrow['password']))
    20. {
    21.    $_SESSION['servicemessage']=2;
    22.    header('Location: https://mydomain.ru/servicepage');
    23.    exit;
    24. }
    25. else
    26. {
    27.    if ($myrow['password'] === $password)
    28.    {
    29.       $_SESSION['id']=$myrow['id'];
    30.       $_SESSION['servicemessage']=4;
    31.       header('Location: https://mydomain.ru/servicepage');
    32.       exit;
    33.    }
    34.    else
    35.    {
    36.       $_SESSION['servicemessage']=3;
    37.       header('Location: https://mydomain.ru/servicepage');
    38.       exit;
    39.    }
    40. }
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    ИМХО, лишние сложности. Статусы аутентификации можно показать на той же странице, что и форма входа. Ну или заменить форму входа фатальным сообщением. И сессию для этого не надо дёргать.
    Ну и сразу скажу что вот эти велосипеды с удалением слешей и обрезкой строк - нафиг не нужны, но и от атаки не защищают. Есть одна функция - mysqli_real_escape_string. Её к логину применить. А пароль - в открытом виде в базе не нужно держать. Хранить надо хэш. password_hash и password_verify уже изобрели.
     
    senn нравится это.