Конспект реалізації прикладної системи на PHP

//

//

Печенье Куки /Cookie

Куки реализуют механизм сохранения небольших данных на стороне веб-клиента в контексте домена.

  • Куки - это именованная запись строкового значения ассоциированная с определенным доменом.
    • Имя куки - регистронезависимая строковый идентификатор.
    • Значение куки - произвольная строка !!!
      • размер куки ограничен 4KB = 4096byte
    • Домен !!!
      • несколько куки могут быть одновременно ассоциированы с одним доменом
        • общее количество куки всех доменов по спецификации не меньше 300
        • ограничение количества куки для каждого домена устанавливаются веб-клиентом:
          • Google Chrome 58.0 до 176
          • Firefox 2.0 — 50
          • Safari 10.0 — 242
          • Opera 9 — 30
          • Internet Explorer 6/7 до 20
      • запрос браузера к домену включает все куки ассоциированные с этим доменом

протокол

Client запрашивает веб-страницу ➡ Server
⬅ сервер отвечает содержимым веб-страницы и файлом cookie
последующие запросы содержат сохраненный файл cookie ➡
⬅ сервер запоминает пользователя с помощью файла cookie и возвращает персонализированный ответ

Функции

//www.php.net/manual/ru/features.cookies.php

PHP прозрачно поддерживает HTTP cookies. Cookies являются частью HTTP-заголовка, поэтому setcookie() должна вызываться до любого вывода данных в браузер. Любые cookies, отправленные серверу веб-клиентом, автоматически включены в суперглобальный массив $_COOKIE.

  • setcookie(string $name, string $value = "",int $expires_or_options = 0, string $path = "", string $domain = "",bool $secure = false, bool $httponly = false): bool !!! устанавливает cookie, которое будет передано клиенту с другими HTTP-заголовками (следует выполнить до основного вывода)
    • name имя куки
      • !!! допускает использование массива name[]
    • value строковое значение
    • expires_or_options числовая метка времени Unix, когда куки потеряет актуальность
    • path !
    • domain .
    • secure .
    • httponly .
  • setcookie(string $name, string $value = "", array $options = []): bool Альтернативная сигнатура доступна с PHP 7.3.0
    • $options !

Сессии

Сессия реализует механизм сохранения данных на стороне веб-сервера для серии нескольких веб-запросов. Идентификация сессии запросами выполняется с помощью механизма куки.

  • session_start(array $options = []): bool возобновляет существующую сессию или создает новую

/

PHP:

/

JS от GPT:

/

JWT

 //wikipedia.org/wiki/JSON_Web_Token
JWT: Debugger | Libraries | Introduction //jwt.io

Это открытый стандарт (RFC 7519) для создания токенов доступа, используя JSON, Base64 и алгоритм шифрования (например  SHA256).

Как правило, токен используется в заголовке Authorization в JavaScript запросе через XMLHttpRequest или Fetch API.

Джерела

Как использовать сессии и переменные сессий в PHP //code.tutsplus.com

https://qna.habr.com/q/801597

granty @granty
Сессия - это Кука с именем PHPSESSID (по умолчанию, его можно изменить) и значением вида 8jae35cosacp2f5qv6g2uqe6i7. Все данные сессии (массив $_SESSION) хранятся на стороне сервера в файле с именем 8jae35cosacp2f5qv6g2uqe6i7 в формате JSON (можно хранить и в БД).
То есть, вам надо не дописывать 1, а угадывать это имя, что нереально.

У Куки можно установить флаг HttpOnly - такие Куки не видны браузерному коду (яваскрипту), а только отправляются на сервер. Внедрённый на страницу вряжеский яваскрипт не сможет получить доступ к такой Куке.

Куку можно перехватить во время передачи по сети, для защиты от этого есть механизмы:

- установить заголовок HSTS, это заставит браузер работать только по HTTPS, те Кука будет зашифрована при передаче по сети.

- в самой сессии можно хранить IP адрес(привязка сессии к IP). Тогда даже с правильной Кукой не залогиниться, поскольку не совпадет IP (который хранится в $_SESSION на стороне сервера). Неудобно если провайдер меняет IP при каждом переподключении.

- можно в сессии хранить User Agent (все равно Кука - она только для этого браузера). Но при автоматическим апдейте браузера придётся авторизоваться заново, и у кого хватило ума перехватить Куку - перехватит и имя User Agent-а.

- можно в сессии хранить fingerprint браузера (или даже всего компа), только надо придумать как безопасно передавать его на сервер, чтобы сохранять в сессии (и для сравнения при авторизации). Его же тоже могут перехватить.

- при каждой авторизации по Куке, и через каждые ## секунд можно(и нужно) делать session_regenerate_id (меняется 8jae35cosacp2f5qv6g2uqe6i7 на другое), там по ссылке есть пример как это сделать прямо внутри сессии. То есть, угнанная Кука быстро перестаёт работать.

- можно делать "сессионную" Куку (не указывать её время жизни). Такая Кука живёт до закрытия браузера, но после закрытия браузера придётся заново вводить логин/пароль

Можно добавить своей безопасности - например отправлять email пользователю при каждой авторизации по Куке, если не было активности Пользователя более 12 часов.

PS: Если пользоваться сессиями правильно - они достаточно безопасны, практически вся авторизация в интернетах построена на них.

Leave a Reply