Основи на управување со сесии
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
Основи на управување со сесии
Референца за `features.session.security.management.php` со подобрена типографија и навигација.
Основи на управување со сесии
Безбедност на сесијата
The session module can not guarantee that the information stored in a session is only viewed by the user who created the session. Additional measures are needed to protect the confidentiality of the session, depending on the value associated with it.
Модулот за сесии не може да гарантира дека информациите зачувани во сесијата ги гледа само корисникот што ја креирал сесијата. Потребни се дополнителни мерки за заштита на доверливоста на сесијата, во зависност од вредноста поврзана со неа. session.use_only_cookies Потребно е да се процени важноста на податоците што се пренесуваат во сесијата и може да се примени дополнителна заштита; ова обично доаѓа по цена, како што е намалена погодност за корисникот. На пример, за да ги заштитите корисниците од едноставна тактика за социјално инженерство,
мора да биде овозможено. Во тој случај, колачињата мора да бидат овозможени безусловно од страна на клиентот, или сесиите нема да работат.
Забелешка: Постојат неколку начини за истекување на постоечки ID на сесијата до трети страни. На пр. JavaScript инјекции, ID на сесии во URL-и, шмркање пакети, физички пристап до уредот, итн. Истечениот ID на сесијата му овозможува на трето лице пристап до сите ресурси поврзани со специфичен ID. Прво, URL-и што пренесуваат ID на сесии. Ако има врски до надворешна страница или ресурс, URL-от што го вклучува ID на сесијата може да биде зачуван во дневниците на референт на надворешната страница. Второ, поактивен напаѓач може да слуша на мрежниот сообраќај. Ако е нешифриран, ID-ите на сесиите ќе течат во чист текст преку мрежата. Решението е да се имплементира SSL/TLS на серверот и да се направи задолжително за корисниците. HSTS треба да се користи за подобрена безбедност.
Дури и HTTPS не може секогаш да ги заштити доверливите податоци. На пример, ранливостите CRIME и Beast може да му овозможат на напаѓачот да ги прочита податоците. Исто така, имајте предвид дека многу мрежи користат HTTPS MITM прокси за целите на ревизија. Напаѓачите, исто така, може да постават таков прокси.
Неадаптивно управување со сесии
Кога session.use_strict_mode Менаџерот за сесии на PHP е стандардно адаптивен. Адаптивниот менаџер за сесии носи дополнителни ризици. http://example.com/page.php?PHPSESSID=123456789 if
session.use_trans_sid
е овозможено, и ракувачот за зачувување на сесиите го поддржува, неиницијализиран ID на сесијата се отфрла и се креира нов. Ова спречува напад што ги принудува корисниците да користат познат ID на сесијата. Напаѓачот може да постави врски или да испраќа е-пошта што содржи ID на сесијата. На пр.
session.use_strict_mode
е овозможено, жртвата ќе започне сесија користејќи го ID на сесијата обезбеден од напаѓачот.
го ублажуваат овој ризик.
Кориснички дефинирани ракувачи за зачувување, исто така, може да поддржат строг режим на сесии со имплементирање на валидација на ID на сесијата. Сите кориснички дефинирани ракувачи за зачувување треба да имплементираат валидација на ID на сесијата. session.use_only_cookies Колачето со ID на сесијата може да биде поставено со атрибутите domain, path, httponly, secure и, од PHP 7.3, SameSite. Постои приоритет дефиниран од прелистувачите. Со користење на приоритетот, напаѓачот може да постави ID на сесија што може да се користи постојано. Употребата на session.use_strict_mode нема да го реши овој проблем. session.use_strict_modeго ублажува овој ризик. Со
Забелешка: =On, неиницијализираниот ID на сесијата ќе биде одбиен. session.use_strict_mode Иако го ублажува ризикот од адаптивно управување со сесии, напаѓачот може да ги принуди корисниците да користат иницијализиран ID на сесијата што е креиран од напаѓач. На пр. JavaScript инјекција. Овој напад може да се ублажи со препораките на овој прирачник. session.use_strict_modeСо следење на овој прирачник, програмерите треба да овозможат, session_regenerate_id() , користете управување со сесии базирано на временски печат и регенерирајте ги ID-ите на сесиите користејќи When access to an obsolete session occurs, developers should save all active session data of the user. As this information will be relevant for an ensuing investigation. The user should be forcefully logged out of all sessions, i.e. require them to reauthenticate. This prevents attackers from abusing stolen sessions.
Кога ќе се пристапи до застарена сесија, програмерите треба да ги зачуваат сите активни податоци од сесијата на корисникот. Бидејќи оваа информација ќе биде релевантна за идна истрага. Корисникот треба да биде присилно одјавен од сите сесии, т.е. да се бара повторно автентицирање. Ова ги спречува напаѓачите да злоупотребуваат украдени сесии.
Од PHP 7.1.0, session_create_id() Пристапот до застарена сесија не мора да укажува на напад. Нестабилна мрежа и/или непосредно бришење на активната сесија ќе резултираат со тоа што легитимните корисници користат застарени сесии. session.use_strict_mode е додадено. Оваа функција може да се користи за ефикасен пристап до сите активни сесии на корисник со додавање на префикс на ID-то на сесијата со ID-то на корисникот. Овозможување
Забелешка: е клучно со оваа поставеност. Во спротивно, злонамерни корисници можат да постават злонамерно ID на сесија за други корисници. should use CSPRNG, на пр. /dev/urandom, или random_bytes() Корисници пред PHP 7.1.0 session_create_id() и функции за хеширање за генерирање на ново ID на сесија. session_create_id() има детекција на судир и генерира ID на сесија според INI поставките на сесијата. Употреба на
се препорачува.
session.use_strict_mode Регенерација на ID на сесија session_regenerate_id() е добра ублажување, но не е доволно. Програмерите мора подеднакво да користат
за безбедност на сесијата. session_regenerate_id() Регенерацијата на ID на сесија го намалува ризикот од украдени ID-ња на сесии, со што
мора да се повикува периодично. На пр. Регенерирајте го ID-то на сесијата на секои 15 минути за содржина чувствителна на безбедност. Дури и во случај кога ID-то на сесијата е украдено, и сесијата на легитимниот корисник и сесијата на напаѓачот ќе истечат. Со други зборови, пристапот од страна на корисникот или напаѓачот ќе генерира грешка за пристап до застарена сесија. must ID-ња на сесии session_regenerate_id() мора да се регенерираат кога се зголемуваат привилегиите на корисникот, како што е по автентицирањето. $_SESSION. (session_regenerate_id() мора да се повика пред поставувањето на информациите за автентикација до
автоматски ги зачувува тековните податоци од сесијата за да го зачува времето/итн. во тековната сесија.) Осигурајте се дека само новата сесија го содржи автентицираниот флаг. Ако завршниот идентификатор е вовлечен, може да се користат и табулатори, но табулаторите и празнините Програмери session.gc_maxlifetimeсе потпираат на истекот на ID на сесијата со
Instead, developers must implement timestamp based session data management.
Наместо тоа, програмерите мора да имплементираат управување со податоци за сесија базирано на временски печат. session_regenerate_id(true); and
session_destroy() Иако менаџерот на сесии може да управува со временски печати транспарентно, оваа функција не е имплементирана. Старите податоци за сесија мора да се чуваат до GC. Во исто време, програмерите мора да се погрижат застарените податоци за сесија да бидат отстранети. Сепак, програмерите не смеат веднаш да ги отстранат активните податоци за сесија. Односно,
session_regenerate_id() does not никогаш не смее да се повикува заедно за активна сесија. Ова може да звучи контрадикторно, но ова е задолжителен услов.
бришење застарени сесии по дифолт. Застарените автентицирани сесии може да бидат присутни за употреба. Програмерите мора да спречат застарените сесии да бидат искористени од било кого. Тие мора да го забранат пристапот до застарени податоци за сесија сами со користење на временски печати.
Наглото отстранување на активна сесија произведува непожелни странични ефекти. Сесиите можат да исчезнат кога има истовремени врски до веб-апликацијата и/или мрежата е нестабилна.
Потенцијалниот злонамерен пристап е неоткриен со наглото отстранување на активните сесии. $_SESSIONНаместо веднаш да ги бришат застарените сесии, програмерите мора да постават краткорочно време на истекување (временски печат) во
, и да го забранат пристапот до податоците за сесија сами. session_regenerate_id(). Мора да биде забрането подоцна. На пр. неколку секунди подоцна за стабилни мрежи, како жична мрежа, и неколку минути подоцна за нестабилни мрежи како мобилни телефони или Wi-Fi.
Ако корисникот пристапи до застарена сесија (истечена сесија), пристапот до неа треба да биде одбиен. Исто така се препорачува да се отстрани автентицираниот статус од сите сесии на корисникот бидејќи веројатно претставува напад.
Правилна употреба на session.use_only_cookies and session_regenerate_id() може да предизвика личен DoS со недозволиви колачиња поставени од напаѓачи. Во овој случај, програмерите може да ги поканат корисниците да ги отстранат колачињата и да ги советуваат дека може да бидат погодени од безбедносен проблем. Напаѓачите може да постават злонамерни колачиња преку ранлива веб-апликација, изложена/злобна додавка за прелистувач, физички компромитиран уред, итн.
Не ја погрешно разберете DoS ризикот. session.use_strict_mode=Вклучено е задолжително за општа безбедност на ID на сесија! Се препорачува сите сајтови да го овозможат session.use_strict_mode.
DoS може да се случи само кога сметката е под напад. Слабост на JavaScript инјекција во апликација претставува најчеста причина.
Бришење податоци за сесија
Застарените податоци за сесија мора да бидат недостапни и избришани. Тековниот модул за сесии не се справува добро со ова.
Застарените податоци за сесија треба да се отстранат што е можно поскоро. Сепак, активните сесии не смеат веднаш да се отстранат. За да се исполнат овие барања, програмерите мора сами да имплементираат управување со податоци за сесија базирано на временски печат.
Set and manage expiration timestamp in $_SESSION. Prohibit access to outdated session data. When access to obsolete session data is detected, it is advised to remove all authenticated status from the user's sessions and force them to re-authenticate. Access to obsolete session data can represent an attack. To achieve this, developers must keep track of all active sessions of every user.
Забелешка: Пристапот до застарена сесија може да се случи и поради нестабилна мрежа и/или истовремен пристап до веб-локацијата. На пр. серверот се обиде да постави нов ID на сесија преку колаче, но пакетот Set-Cookie можеби не стигнал до клиентот поради губење на врска. Една врска може да издаде нов ID на сесија од session_regenerate_id(), but another concurrent connection may not have received the new session ID yet. Therefore, developers must prohibit access to obsolete session at a later stage. I.e. timestamp based session management is mandatory.
, но друга истовремена врска можеби сè уште не ја добила новата ID на сесијата. Затоа, програмерите мора да го забранат пристапот до застарените сесии во подоцнежна фаза. Односно, управувањето со сесии базирано на временски ознаки е задолжително. session_regenerate_id() nor session_destroy(), но временските ознаки мора да се користат за контрола на пристапот до податоците од сесијата. Да session_gc() отстранете ги застарените податоци од складиштето за податоци на сесијата.
Сесија и заклучување
Податоците од сесијата се заклучуваат за да се избегнат состојби на трка по дифолт. Заклучувањето е задолжително за одржување на конзистентноста на податоците од сесијата низ барањата.
Сепак, заклучувањето на сесијата може да биде злоупотребено од напаѓачи за извршување на DoS напади. За да се намали ризикот од DoS напад преку заклучување на сесијата, минимизирајте ги заклучувањата. Користете сесии само за читање кога податоците од сесијата не треба да се ажурираат. Користете ја опцијата 'read_and_close' со session_start().
session_start(['read_and_close'=>1]);
Close the session as soon as possible after updating $_SESSION by using session_commit().
Тековниот модул за сесии not detect any modification of $_SESSION when the session is inactive. It is the developer's responsibility not to modify $_SESSION when the session is inactive.
Активни сесии
Програмерите треба да водат евиденција за сите активни сесии за секој корисник. И да ги известат колку активни сесии, од кој IP (и област), колку долго е активна, итн. PHP не води евиденција за ова. Програмерите се должни да го сторат тоа.
Постојат различни начини за имплементација на ова. Една можна имплементација е поставување база на податоци што води евиденција за потребните податоци и ги складира сите релевантни информации. Бидејќи податоците од сесијата се GCed, програмерите мора да се грижат за GCed податоците за да ја одржат конзистентноста на базата на податоци за активни сесии.
One of the simplest implementations is "User ID prefixed session ID" and store the required information in $_SESSION. Many databases posses good performance for selecting string prefix. Developers MAY use session_regenerate_id() and session_create_id() за ова.
Никогаш не користете доверливи податоци како префикс. Ако ID-то на корисникот е доверливо, разгледајте употреба на hash_hmac().
Овозможување session.use_strict_mode е задолжително за оваа поставка. Осигурете се дека е овозможено. Во спротивно, базата на податоци за активни сесии може да биде компромитирана.
Управувањето со сесии базирано на временски ознаки е задолжително за откривање пристап до застарени сесии. Кога ќе се открие пристап до застарена сесија, треба да се отстранат знаменцата за автентикација од сите активни сесии на корисникот. Ова ги спречува напаѓачите да продолжат да експлоатираат украдени сесии.
Сесија и Авто-најава
Програмерите не смеат да користат долготрајни ID-ња на сесии за авто-најава бидејќи го зголемува ризикот од украдени сесии. Функцијата за авто-најава треба да биде имплементирана од програмерот.
Користете безбеден еднократен хеш клуч како клуч за авто-најава користејќи setcookie(). Користете безбеден хеш појак од SHA-2. На пр. SHA-256 или поголем со случајни податоци од random_bytes() or /dev/urandom.
Ако корисникот не е автентициран, проверете дали еднократниот клуч за авто-најава е валиден или не. Во случај да е валиден, автентицирајте го корисникот и поставете нов безбеден еднократен хеш клуч. Клучот за авто-најава мора да се користи само еднаш, т.е. никогаш не повторно користете клуч за авто-најава, секогаш генерирајте нов.
An auto-login key is a long life authentication key, it should be protected as much as possible. Use path/httponly/secure/SameSite cookie attributes to secure it. I.e. never transmit the auto-login key unless required.
Клучот за автоматско најавување е долготраен автентикациски клуч, треба да се заштити што е можно повеќе. Користете ги атрибутите на колачињата path/httponly/secure/SameSite за да го заштитите. Односно, никогаш не го пренесувајте клучот за автоматско најавување освен ако не е потребно.
Програмерите мора да ги имплементираат функциите што оневозможуваат автоматско најавување и ги отстрануваат непотребните колачиња за автоматско најавување.
CSRF (Cross-Site Request Forgeries) напади
output_add_rewrite_var() Сесиите и автентикацијата не штитат од CSRF напади. Програмерите мора сами да имплементираат CSRF заштита.
Забелешка: може да се користи за CSRF заштита. Погледнете ја страницата со упатства за повеќе детали. output_add_rewrite_var() PHP пред 7.2.0 го користи истиот бафер за излез и INI поставка како trans sid. Затоа, употребата на
со PHP пред верзија 7.2.0 не се препорачува.
Повеќето рамки за веб-апликации поддржуваат CSRF заштита. Погледнете го упатството за рамката на веб-апликацијата за повеќе детали.