За последние 24 часа нас посетили 20938 программистов и 1108 роботов. Сейчас ищут 419 программистов ...

Сессии, суперглобальные массивы и AJAX

Тема в разделе "PHP для новичков", создана пользователем SpikePHP, 9 мар 2017.

  1. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Помогите разобраться.

    Итак, у нас есть суперглобальные массивы :
    • $GLOBALS
    • $_SERVER
    • $_GET
    • $_POST
    • $_FILES
    • $_COOKIE
    • $_SESSION
    Допустим я зашел на сайт, под логином и паролем. Они у меня лежат в сессии и в куках. В куках, чтобы после переоткрытия браузера, данные сели в сессии и выполнить автоматический вход.

    На этом же сайте я делаю ajax-запрос на какой-то ххх.php скрипт. Я так понял, что браузер отправляет все свои куки(в том числе PHPSESSID) при ajax-запросах, и на xxx.php мы имеем доступ к суперглобальным массивам $_SESSION и $_COOKIE.

    Почему же тогда все остальные массивы тоже носят имя суперглобальных, если только $_SESSION и $_COOKIE могут быть доступны из разных скриптов?
     
  2. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    Суперглобальные - потому что не ты их объявляешь, а PHP. $_SESSION и $_COOKIE также создаются в момент запуска скрипта, на основе данных, переданных серверу, так что это только видимость, что они "доступны из разных скриптов", просто они заполняются информацией, которая где-то между запусками хранится (в случае с сессиями - на харде сервера, в случае с куками - на харде у юзера)
     
    SpikePHP нравится это.
  3. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Тогда назвали бы "автоматические" либо "самостоятельные" массивы:)
     
  4. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    Ну ещё "супер", потому что с ними не нужно использовать global
     
    SpikePHP нравится это.
  5. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    @mkramer Глобальность связана с видимостью из процедур, а не из разных скриптов. Так?
     
  6. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Не только процедур,подразумевается доступность из любого места в пределах скрипта.
     
    SpikePHP нравится это.
  7. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Всем спасибо. Походу разобрался
     
  8. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    логин с паролем? логин должен лежать в бд, а пароль даже там не должен лежать вообще. Пароль нигде не сохраняется. В этом соль.
     
    Fell-x27 и denis01 нравится это.
  9. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    В БД я храню хэш пароля. В куках тоже храню хэш пароля. Логин хранится как есть. Так не правильно? А если не правильно, то как нужно?
     
  10. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Клиенту передается только идентификатор сессии.

    Чем они тебе не суперглобальные, если доступны из всех областях видимости.

    И не путай скрипты клиента и сервера.
     
  11. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    зачем? с какой целью?

    где?

    для чего?

    нужно учиться ставить задачи, и тогда в их границах будет легко найти решение
    --- Добавлено ---
    если оно вообще есть :D
     
  12. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Юзер регится. Хэш пароля и логин я храню в БД.

    Юзер заходит на сайт. В сессии храню хэш пароля и логин, первым делом сравниваю их с хэшом и паролем из БД. Если равны, юзер заходит. Если не равны, то достаю хэш пароля и логин из кук и сравниваю их с БДэшными. Если равны, то юзер заходит, а в сессию записываю хэш пароля и логин.

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

    Таким образом я решил для себя две задачи :
    • автоматический вход на сайт после переоткрытия браузера
    • аутентификация пользователя на сайте
    Так не правильно? А как правильно?
     
  13. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.632
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    @SpikePHP, не надо хранить даже хэш пароля. Хватает хранить инфу, что пользователь проходил аутентификацию.
     
    SpikePHP нравится это.
  14. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Это относится к сессии? Но один раз его нужно аутентифицировать с помощью хэша пароля и логина, а потом уже хранить инфу, что он проходил аутентификацию?
     
  15. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    @SpikePHP, в общем случае пишешь в сессию id пользователя, если он туда записан - юзер авторизирован, если нет - не авторизирован. В куке светить свою внутреннюю кухню вообще не нужно. Если нужна галка "запомнить меня", туда токен пишется случайный, а не логин или пароль или что-то ещё. И, естественно, этот же токен пишется куда-нибудь в базу
     
    SpikePHP нравится это.
  16. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    @mkramer твой ответ расставил все точки над i. Теперь всё ясно. Спасибо тебе и сообществу!

    P.s. что можно зашифровать в токене кроме User-agent'a ?
     
  17. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    Не надо в нём ничего шифровать. Просто случайный набор символов. Если нужно одновременно на нескольких машинах, то просто хранишь по нескольку токенов для пользователя, т.е. доп. таблица
    Код (Text):
    1. user_id | token
    Если нужно всех разаворизовать, то удаляешь просто из этой таблицы. Вот защита от угона сессии - это уже сложнее, там много подходов, но все не идеальны
     
    SpikePHP нравится это.
  18. SpikePHP

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

    С нами с:
    6 май 2015
    Сообщения:
    130
    Симпатии:
    23
    Я подумал, что для усиления безопасности, было бы неплохо привязать как-то токен к браузеру или к клиенту
     
  19. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.548
    Симпатии:
    1.754
    Это уже разные варианты защиты от угона сессии. Можете, при желании
     
    SpikePHP нравится это.
  20. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    обновил браузер - токен отвалился.
     
    SpikePHP нравится это.