KWALIFIKACJA INF3 - CZERWIEC 2022

PYTANIE NR 38.
W której tablicy superglobalnej w środowisku PHP powinno się przechowywać dane związane z logowaniem użytkownika w sposób zapewniający ich bezpieczeństwo?
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Dane stanu logowania (np. identyfikator użytkownika) powinny być przechowywane po stronie serwera, aby klient nie mógł ich łatwo modyfikować. W PHP służy do tego mechanizm sesji dostępny przez tablicę $_SESSION. $_COOKIE jest po stronie przeglądarki, a $_SERVER i $_FILES nie służą do utrwalania stanu logowania.

Pełne wyjaśnienie:

Stan logowania to informacja, że po udanym uwierzytelnieniu (np. sprawdzeniu loginu i hasła) użytkownik ma być rozpoznawany w kolejnych żądaniach HTTP. Ponieważ HTTP jest bezstanowe, aplikacja musi ten stan gdzieś utrzymać.

W PHP standardowo robi się to przez sesję, czyli dane przechowywane po stronie serwera, dostępne w kodzie przez tablicę $_SESSION. W sesji zapisuje się zwykle np. ID użytkownika, rolę lub informację o zalogowaniu. Klient dostaje jedynie identyfikator sesji (najczęściej w cookie sesyjnym), a właściwe dane pozostają na serwerze, co ogranicza ryzyko ich modyfikacji po stronie użytkownika.

Dlaczego pozostałe odpowiedzi są błędne w tym kontekście:

  • $_COOKIE przechowuje dane po stronie przeglądarki. Użytkownik może je podejrzeć i zmienić, więc nie powinno się tam trzymać informacji typu "czy zalogowany" jako źródła prawdy (co najwyżej tokeny z odpowiednimi zabezpieczeniami, ale to inny temat).
  • $_SERVER zawiera informacje o środowisku i żądaniu (nagłówki, ścieżki, adres IP itd.), ale nie służy do przechowywania trwałego stanu logowania między żądaniami.
  • $_FILES dotyczy plików przesyłanych formularzem i nie ma związku z utrzymywaniem sesji logowania.

W praktyce samo użycie $_SESSION nie wystarcza, by "gwarantować" bezpieczeństwo: trzeba też dbać o konfigurację cookie sesji (np. flagi HTTPOnly/Secure), regenerację identyfikatora sesji po logowaniu oraz ochronę przed XSS/CSRF. Jednak spośród podanych superglobalnych właściwym miejscem na dane logowania jest $_SESSION.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
$_SESSION to tablica superglobalna, w której aplikacja PHP przechowuje dane sesji użytkownika po stronie serwera. Służy m.in. do utrzymania stanu między żądaniami HTTP, np. zapamiętania, że użytkownik jest zalogowany, oraz przechowywania jego ID i uprawnień.
Cookie są po stronie przeglądarki, więc użytkownik może je podejrzeć i zmodyfikować. Sesja przechowuje dane na serwerze, a klient ma zwykle tylko identyfikator sesji. To zmniejsza ryzyko manipulacji stanem logowania po stronie klienta.
Może, ale z dużą ostrożnością. Cookie nie powinno być "źródłem prawdy" o zalogowaniu (np. flaga zalogowany=1), bo da się je zmienić. Stosuje się raczej bezpieczne tokeny "remember me" i weryfikuje je na serwerze, najlepiej z ograniczeniami czasowymi.
Najczęściej zapisuje się identyfikator użytkownika, jego rolę/uprawnienia oraz znaczniki czasu (np. ostatnia aktywność). Nie zapisuje się tam hasła w postaci jawnej. Celem jest szybkie rozpoznanie użytkownika i kontrola dostępu w kolejnych żądaniach.
Po udanym logowaniu zaleca się regenerację identyfikatora sesji, aby ograniczyć ryzyko tzw. session fixation. Dzięki temu nawet jeśli ktoś poznał wcześniejsze ID sesji, po zalogowaniu przestaje ono być użyteczne. To element dobrej praktyki bezpieczeństwa.
Bezpieczeństwo zależy też od konfiguracji i ochrony aplikacji. Jeśli aplikacja ma XSS, napastnik może wykradać identyfikatory sesji. Ważne są m.in. bezpieczne cookie sesyjne (HTTPOnly/Secure), poprawne wygaszanie sesji oraz kontrola czasu życia i aktywności.
Session hijacking to przejęcie sesji, czyli zdobycie identyfikatora sesji i podszycie się pod użytkownika. Ponieważ sesja utrzymuje stan logowania, kradzież ID sesji może dać dostęp do konta. Pomagają m.in. HTTPS, flagi Secure/HTTPOnly i ograniczanie czasu sesji.
Wylogowanie polega na usunięciu danych sesji i unieważnieniu sesji po stronie serwera. W praktyce czyści się zmienne sesyjne, a następnie niszczy sesję, aby identyfikator sesji nie mógł być dalej używany. Dodatkowo warto skasować cookie sesyjne w przeglądarce.
$_SERVER zawiera informacje o żądaniu i środowisku serwera (np. URI, nagłówki, adres IP, dane o skrypcie). To dane "wejściowe" i kontekstowe, a nie magazyn stanu użytkownika. Nie zapewnia mechanizmu utrzymania danych między kolejnymi żądaniami.
Częsty błąd to mylenie sesji z cookie oraz zakładanie, że cookie jest bezpieczne, bo "to tylko przeglądarka". Inny błąd to wybór $_SERVER, bo "serwer jest bezpieczny", mimo że ta tablica nie służy do zapisu stanu. Warto zapamiętać przeznaczenie każdej superglobalnej.
info

Statystycznie 46% uczniów zna prawidłową odpowiedź. trudne

W praktyce zawodowej kluczowe jest to, że dane stanu logowania (np. identyfikator użytkownika) powinny być przechowywane po stronie serwera, aby klient nie mógł ich łatwo modyfikować.

Źródła:

  • PHP Manual: Superglobals — https://www.php.net/manual/en/language.variables.superglobals.php (dostęp: 2026-02-27)
  • PHP Manual: Sessions — https://www.php.net/manual/en/book.session.php (dostęp: 2026-02-27)
  • OWASP Cheat Sheet Series: Session Management Cheat Sheet — https://cheatsheetseries.owasp.org/cheatsheets/Session_Management_Cheat_Sheet.html (dostęp: 2026-02-27)

Materiały:

  • Dokumentacja PHP: Sessions (sesje) oraz superglobals
  • Materiały OWASP dotyczące uwierzytelniania i zarządzania sesją
  • Kursy PHP obejmujące logowanie, sesje i cookies

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego