За последние 24 часа нас посетили 15276 программистов и 1671 робот. Сейчас ищут 884 программиста ...

Авторизация на сайте портфолио

Тема в разделе "PHP для новичков", создана пользователем Magnum, 23 июл 2016.

  1. Magnum

    Magnum Активный пользователь

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    Здравствуйте мастера. Пишу портфолио, изучая php. Написал регистрацию такого типа:

    PHP:
    1. <?php
    2. require '../conf/config.php';
    3. require '../conf/style.php';
    4. require '../conf/head.php';
    5.  
    6. if (isset($_COOKIE['login'])) {
    7.     header('Location: ../index.php');
    8. }
    9.  
    10. $q = $db -> query("SELECT `sekret_kode` FROM admin LIMIT 1");
    11. $sekret_kode = $q -> fetch_row();
    12.  
    13. if (isset($_POST['sekret_kode'])) {
    14.     if (intval($_POST['sekret_kode']) == intval($sekret_kode[0])) {
    15.         $_SESSION['kode'] = '';
    16.     }
    17. }
    18.  
    19. if (isset($_SESSION['kode'], $_POST['login'], $_POST['password'])) {
    20.     $admin_data = $db -> query("SELECT `login`, `pass` FROM `admin` WHERE 1");
    21.     $admin = $admin_data -> fetch_assoc();
    22.  
    23.     $login = trim($_POST['login']);
    24.     $password = md5(md5($_POST['password']));
    25.  
    26.     if ($admin['login'] == $login AND $admin['pass'] == $password) {
    27.         $cockie = setcookie('login', $admin['login'], time()+3600*24*7, '/');
    28.         if ($cockie) header('Location: ../index.php');
    29.         else echo 'error1';
    30.     } else echo 'ererer00010101010';
    31. }
    32.  
    33. ?>
    34.  
    35. <div class="maint">
    36. <a class="cbut" href="cab.php"><i class="fa fa-users"></i> Вход в аккаунт админа</a>
    37. </div>
    38.  
    39. <?php if (isset($_SESSION['kode'])): ?>
    40. <div class="activ">
    41.     <form method="POST" action="cab.php">
    42.     Логин:<br>
    43.     <input type="text" name="login"><br>
    44.     Пароль:<br>
    45.     <input type="password" name="password"><br>
    46.     <input type="submit" value="ВХОД">
    47.     </form>
    48. </div>
    49. <?php else: ?>
    50.     <div class="activ">
    51.         <form method="POST" action="cab.php">
    52.         Секретный код:<br>
    53.         <input type="text" name="sekret_kode"><br>
    54.         <input type="submit" value="ВХОД">
    55.         </form>
    56.     </div>
    57. <?php endif; ?>  
    58.  
    59. <?php
    60. require '../conf/foot.php';
    61. ?>
    Тут сначала нужно в форму ввести секретный код, чтобы "пустило" к вводу пароля и логина. При правильном вводе пары логин:пароль создаются куки. И теперь, где мне нужен просмотр только для администрации, я проверяю так: if (isset($_COOKIE['login'])) это правильно так, или это небезопасно, а нужно ещё как-то по другому думать?

    Заранее спасибо за ответы)
     
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Любой сможет создать cookie с именем login, так что не безопасно.
    Создавай сессию, а не cookie, сессию может создать только твой скрипт.
     
    Magnum нравится это.
  3. Magnum

    Magnum Активный пользователь

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    а если в куки поместить логин:пароль и каждый раз проверять их значение?
     
  4. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @Magnum, ставь сессии. И не логин и пароль а факт того что пользователь был идентифицирован.
     
    Magnum нравится это.
  5. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Ни в коем случае. Куки видно в браузере. Их можно украсть. Даже когда авторизацию делают без сессий, только на куках (видел такой вариант), в куку кладут только флаг "пользователь авторизирован" и id пользователя.
    --- Добавлено ---
    Но я предпочитаю через сессии
     
    Magnum и Deonis нравится это.
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Я далеко на профи в отношении безопасности, но то что это одна из худших идей - точно. Даже в сессии хранить данные для авторизации нельзя, а в куках и подавно.
     
    Magnum нравится это.
  7. Magnum

    Magnum Активный пользователь

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    А если в сессиях нельзя, то как тогда авторизовать?
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Не то, чтобы нельзя, бесполезно :) Но оттуда их никак не забрать, кроме как каким-нибудь шелом, но если уже шел залили - там вообще всё что угодно сделать можно.
    Много раз тебе уже написали - записываешь в сессию id пользователя.

    PHP:
    1.  
    2. if (!isset($_SESSION["user_id"])) {
    3.    /* Чувак не авторизирован, посылаем авторизироваться */
    4. }
    5.  
    6. /* Чувак авторизирован. Получаем по id его данные и делаем, что нам надо */
     
    Magnum нравится это.
  9. Magnum

    Magnum Активный пользователь

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    Всё, спасибо всем, понял))
     
  10. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    На этом форуме используется движок XenForo, который идентифицирует пользователя по куке. (Как и почти все остальные форумы). Самый распостраненный в интернетах сайтовый движок WordPress тоже использует специальную куку, а не читает айди из сессии.

    Не надо бояться. Надо делать правильно: хранить id пользователя в куке можно, но дополнительно надо хранить некий хеш/подпись/назови_хрень_как_угодно, по которой ты сумеешь проверить что эта кука не поддельная.
     
    Magnum нравится это.
  11. Magnum

    Magnum Активный пользователь

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    это например, можно сгенерировать текст, например, на 20 символов. Поместить его в куки и потом проверять на соответствие тому что я генерировал, и тому что находится в куках?
    Но а куда записать его для сравнения, в сессию мб? Или с базы брать какое-то поле, и переводить его в md5, к примеру?
     
  12. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Возможны разные варианты. И случайное значение, которое сохраняется в таблицу, и хеш от пароля+соль.

    Про сессионные значения важно знать что они недолго живут. По умолчанию — до закрытия окна браузера.
    Соответственно если ты собираешся дать пользователю логиниться с опцией
    [x] Запомнить меня
    то полюбому тебе понадобится долгоживущая кука. Никогда не пытайся объявить саму сессию долгоживущей: это противоречит самой идее сессии и ты только словишь новые проблемы.
     
    mahmuzar и Magnum нравится это.
  13. Magnum

    Magnum Активный пользователь

    С нами с:
    19 июл 2015
    Сообщения:
    62
    Симпатии:
    0
    я понял, хорошо, спасибо)
     
  14. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    P.S. XenForo создаёт аутентификационную куку с именем xf_session, что какбы намекает на сессию. Время жизни этой куки — до закрытия браузера. Подробности реализации я не изучал. Знаю только, что если пользователь отметил галочкой "Запомнить меня", то дополнительно создаётся ещё одна кука с именем xf_user и в ней ID пользователя + какой-то хеш.

    Если xf_session удалить, а xf_user оставить, то форум не забудет тебя, а восстановит идентификацию, опираясь на данные из xf_user. То есть мы имеем некую комбинацию подходов.

    [​IMG]
     
    mahmuzar и Magnum нравится это.