Session use trans sid что это
Директива Session.use_trans_sid
Директива Session.use_trans_sid указывает, используется ли прозрачная поддержка SID или нет. По умолчанию 0 (отключено).
Включенная директива Session.use_trans_sid создает константу SID (string), которая содержит либо имя сессии и идентификатор в виде «session_name = session_id» либо пустую строку, если идентификатор сессии был установлен в соответствующие Cookies. Следовательно для работы константы SID необходимо отключать директивы Session.use_cookies и Session.use_only_cookies.
Передать идентификатор сессии можно с помощью Cookies или параметра URL. Метод с Cookies является оптимальным, но он не всегда доступен. Поэтому PHP предоставляет второй способ, который внедряет идентификатор сессии непосредственно в URL.
При включенной директиве Session.use_trans_sid, в относительные URI будут автоматически добавляться идентификаторы сессии. Если директива отключена, необходимо самостоятельно добавлять идентификатор любым доступным способом, например в URL адрес или скрытыми полями формы.
Приведенный ниже пример демонстрирует использование константы SID.
Результат работы примера:
Функция Htmlspecialchars может использоваться для вывода SID с целью предотвращения XSS-атак.
Замечание: Неотносительные URL указывают только на внешние сайты и потому SID к ним не добавляется, так как это увеличивало бы риски в области безопасности, в частности, риск утечки SID другому серверу.
PHP cессии
Введение
HTTP протокол сам по себе stateless.
Сессии нужны для хранения информации о пользователях. Они используют cookie делают примерно то же что и cookies но лишены большинства их недостатков
Сессии это инструмент для управления состоянием приложения.
У каждой сессии есть уникальный номер Session ID или SID
Сессия должна быть начата до отправки данных браузеру.
Данные на сервере и куки в браузере работают в связке. SID хранится в куки.
Сервер «помнит» пользователя пока работа с сайтом ведётся в сессии.
Сессия удаляется автоматически при закрытии браузера. рассмотрим эти задачи в следующем параграфе
Что можно сделать с помощью сессий
Пример
Из обычной жизни: когда вы получаете счёт за электричество, там содержится много разной информации. Но чтобы оплатить его, нужен только номер счёта. Вводите номер счёта и всё остальное подтянется с сервера.
Пример запроса от клиента
Request 1 GET /homepage.php HTTP/1.1 Host: urn.su Accept: */*
Рекомендуется отпрвлять Session ID с сервера в виде куки. Другой вариант: Session ID можно передать в URL параметре.
Response 1 HTTP/1.1 200 OK Content-type: text/html Set-Cookie: SID
Запрос к другой странице будет уже с SID
Request 2 GET /aboutus.php HTTP/1.1 Host: urn.su Cookie: SID Accept: */*
Примерно таким образом куки позволяют запоминать пользовательские настройки
Где настраивать сессии
Настроек более 40, способов их задавать тоже несколько.
С помощью php.ini можно изменить настройки для всего PHP сервера.
Session Configurations Options
Полный список доступен на http://php.net
session.auto_start: автоматически начинает сессию.
По умолчанию выключена.
session.name: задаёт имя текущей сессии и сессионной куки
По умолчанию PHPSESSID.
session.save_path: путь по которому сохраняется информация о сессии
По умолчанию tmp директория сервера.
session.gc_maxlifetime: максимальное время жизни
По умолчанию 1440 секунд (24 минуты).
session.cookie_lifetime: время жизни куки, которая отправляется браузеру. По сути это значение, которое мы добавляем к time() когда задаём expires
Если включить то куки будут отправляться только по HTTPS.
По умолчанию выключена.
session.use_strict_mode: если включить то SID которые созданы не сервером будут отклонены.
По умолчанию выключена.
Если включить куки будет доступна только по HTTP (и HTTPS). То есть JavaScript или bbscript не смогут получить к куки доступ
По умолчанию выключена.
session.use_cookies: указывает нужно ли сохранять SID в cookies на стороне клиента.
По умолчанию включена.
session.use_only_cookies: заставляет сессию использовать только cookie для хранения SID. Работает совместно с session.use_cookies
По умолчанию включена.
session.use_trans_sid: контролирует использование «прозрачных» SID
Эту опцию обычно включают только тогда, когда нет поддержки cookies
По умолчанию выключена.
Пользуйтесь trans sid с осторожностью так как это может поставить под угрозу безопасность пользователя.
session.cache_limiter: указывает способ контроля за кэшем во время сессии.
По умолчанию nocache.
Для сессий с аутентификацией нужно, чтобы кэширование в браузере было отключено.
session.cookie_samesite: контролирует доступности куки в кроссдоменных запросах.
Доступные варианты: Lax и Strict
Кросдоменные запросы могу быть не только от злоумышленников. Их может делать ваш сайт с разных поддоменов. Либо вы можете следить за перемешением пользователя между своими проектами.
Функции
Полный список доступен на php.net
session_start(): начинает сессию и делает доступной переменную $_SESSION.
session_name(): переименовывает сессию.
Меняет значение, заданное с помощью функции session.name.
session_id(): получает или устанавливает текущий session id
set new session ID: session_id(‘ ‘)
session_destroy(): удаляет всю информацию записанную в сессию
Настройки вашего сервера могут отличаться, это просто пример
Инициализация сессии
Эта функция должна быть включена во все скрипты, в которых вам нужно использовать сессии.
Сохраняет данные в супер глобальной переменной $_SESSION, которая является массивом
Демонстрацию работы session_start() в вашем браузере вы можете сделать на этой странице
Посмотреть куки можно в Chrome DevTools → Application → Cookies
Выберите andreyolegovich.ru или urn.su и найдите AOSESSID
Изучить файл с данными о сессии можно в директории, которую вы указали в php_value session.save_path
Поэтому я смотрю содержимое там
Удаление сессии
Сессия истекает когда закрывается браузер, наступает таймаут, её явно делают просроченной.
Уничтожение сессии включает в себя:
session_destroy()
Удаляет все данные привязанные к сессии.
Не удаляет никаких переменных из суперглобальной переменной $_SESSION.
Если использовать только session_destroy() можно переиспользовать $_SESSION просто вызвав session_start()
unset()
unset() это стандартная PHP функция, которую использую не только с сессиями.
Чтобы очистить username нужно выполнить
unset ($_SESSION[ ‘username’ ]);
Чтобы очистить всё можно обойтись без unset()
Пример полного удалёния сессии
Настройка во время выполнения
Если установить в качестве значения общедоступную для чтения директорию, например, /tmp (по умолчанию), остальные пользователи сервера получат возможность перехватить сессию пользователя, получив список файлов такой директории.
При использовании необязательного аргумента N уровня директорий, как описано выше, учтите, что использование значений выше чем 1 или 2 недопустимо для большинства сайтов, так как требуется очень большое количество директорий: например, значение 3 приводит к 64^3 директориям в файловой системе, которые приводят к огромным потерям места и inode.
Only use N greater than 2 if you are absolutely certain that your site is large enough to require it.
Если разные скрипты имеют разные значения session.gc_maxlifetime, но при этом одни и те же места для хранения данных сессии, то скрипт с минимальным значением уничтожит все данные. В таком случае следует использовать эту директиву вместе с session.save_path.
Замечание: Начиная с PHP 5.4.0 session.entropy_file имеет значение по умолчанию равное /dev/urandom или /dev/arandom, если они доступны. В PHP 5.3.0 эта директива по умолчанию пуста.
Отметка окончания времени устанавливается по отношению к серверному времени, который не обязательно совпадает с временем в браузере клиента.
Замечание: Управление сессией на основе URL имеет дополнительные риски безопасности по сравнению с управлением на основе cookies. В качестве примера можно упомянуть такие ситуации, когда пользователи могут отправить URL, содержащий идентификатор активной сессии своим друзьям по электронной почте или сохранить ссылку с идентификатором в закладках и все время посещать сайт с одним и тем же идентификатором.
Эта опция была добавлена в PHP 5.
Эта опция была добавлена в PHP 5.
Замечание: Строго рекомендуется не отключать эту опцию.
Настройки register_globals влияют на способ хранения и использования переменных сессии.
Работа с сессиями в PHP
Отредактировано: 04 Февраля 2019
Сессия, механизм php, созданный для возможности передачи данных предназначенных конкретному пользователю при повторных запросах (веб-сервер не поддерживает постоянного соединения с клиентом, и каждый запрос обрабатывается, как новый, без какой-либо связи с предыдущими).
Принцип работы сессий: сервер выдает браузеру уникальный идентификатор, и просит передавать его с каждым запросом. Передача происходит стандартными способами, либо через куки, либо через переменные POST/GET.
Идентификатор сессии — это обычная переменная, по умолчанию ее имя — PHPSESSID. Можно изменить директивой session.name в php.ini.
На сервере за передачу информации о сессиях отвечают две настройки в php.ini:
Соответственно, если включена только первая настройка и браузер отдает куки, то идентификатор передается через них, если не отдает, то сессия обнуляется при каждом запросе.
Если включена только вторая, то PHP дописывает к каждой относительной ссылке и к каждой форме передачу идентификатора сессии, примерно так:
Если включены обе, то браузеру выставляется кука, а ссылки и формы дополняются только если кука найдена не была.
Запись данных в сессию работает так:
Используем например так:
Удаление переменных из сессии:
Для закрытия сессии используется функция:
Для управления HTTP-заголовками отвечающими за кэш, используется функция session_cache_limiter(). Установка nocache, например, отменяет кэширование на стороне клиента.
Сессии. Подробное описание работы и объяснение механизма.
Подробно расписывать нужду в таком механизме я не буду. Это такие хрестоматийнык случаи, как корзина покупок в е-магазине, авторизация, а так же, и не совсем тривиальные проблемы, такие, например, как защита интерактивных частей сайта от спама.
В принципе, довольно несложно сделать собственный аналог сессий, не такой функциональный, как встроенный в PHP, но похожий по сути. На куках и базе данных.
При запросе скрипта смотрим, пришла ли кука с определенным именем. Если куки нет, то ставим ее и записываем в базу новую строку с данными пользователя. Если кука есть, то читаем из базы данные. Еще одним запросом удаляем из базы старые записи и вот у нас готов механизм сессий. Совсем несложно. Но есть некоторые нюансы, которые делают предпочтительным использование именно встроенного механизма сессий.
Если включена только первая, то при старте сессии (при каждом вызове session_start() ) клиенту устанавливается кука. Браузер исправно при каждом следующем запросе эту куку возвращает и PHP имеет идентификатор сессии. Проблемы начинаются, если браузер куки не возвращает. В этом случае, не получая куки с идентификатором, PHP будет все время стартовать новую сессию, и механизм работать не будет.
По умолчанию в последних версиях PHP включены обе опции. Как PHP поступает в этом случае? Кука выставляется всегда. А ссылки автодополняются только если РНР не обнаружил куку с идентификатором сессии. Когда пользователь в првый раз за этот сеанс заходит на сайт, ему ставится кука, и дополняются ссылки. При следующем запросе, если куки поддерживаются, PHP видит куку и перестает дополнять ссылки. Если куки не работают, то PHP продолжает исправно добавлять ид к ссылкам, и сессия не теряется.
Пользователи, у которых работают куки, увидят длинную ссылку с ид только один раз.
Следует помнить, что пхп лочит файл сессии. То есть, если один ваш скрипт стартует сессию и долго выполняется, а другой пытается в это время стартовать её с тем же идентификатором, то он зависнет. Поэтому в долго выполняющихся скриптах следует стартовать сессию только тогда, когда она нужна, и тут же закрывать её, с помощью session_write_close()