Jak bezpieczne są sesje PHP?

Jestem przede wszystkim programistą C++, ale staram się podłapać trochę PHP.

Widocznie sposobem implementacji sesji użytkownika sieci Web jest zapisanie identyfikatora użytkownika w pliku cookie przy użyciu zmiennej $_SESSION.

Czy nie jest możliwe, aby ktoś po prostu zmodyfikował swój plik cookie, nadał mu inne uprawnienia lub zalogował się jako inny użytkownik?

Wygląda na to, że ten mechanizm uwierzytelniania polega na tym, że użytkownik przechowuje swój IDENTYFIKATOR w pliku - a następnie po prostu ufa, że nie zmieni to.

Czy jest coś, co temu zapobiega?

Dzięki!

Author: James, 2012-04-15

6 answers

Nie, sesja jest przechowywana na serwerze i nie może być dostępna dla użytkownika. Służy do przechowywania informacji w całej witrynie, takich jak sesje logowania.

Oto przykład użycia:

<?php
session_start();
if ($_POST['password'] == "1234")
$_SESSION['auth'] = true;
?>

Sesja może być następnie dostępna w całej witrynie, aby sprawdzić, czy użytkownik został uwierzytelniony.

<?php
session_start();
if ($_SESSION['auth'] == true) {
    echo "You are logged in!";
}
?>

Użytkownik nie może edytować tych wartości, jednak identyfikator sesji jest przechowywany na komputerze za pomocą pliku cookie jako długi losowy ciąg znaków. Jeśli nieautoryzowany użytkownik uzyska dostęp do te ciągi jest możliwe, aby uzyskać dostęp do witryny.

 8
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-15 20:07:55

Sesje PHP są bezpieczne tylko wtedy, gdy aplikacja je tworzy. Sesje PHP dają użytkownikowi pseudorandomowy ciąg znaków ("session ID"), z którym może się identyfikować, ale jeśli ten ciąg zostanie przechwycony przez atakującego, atakujący może udawać, że jest tym użytkownikiem.

Co robić

Ta informacja pochodzi z "Podstawy zarządzania sesjami" w podręczniku PHP , ale nieco uproszczona. Niektóre rzeczy mogły zostać pominięte. Koniecznie przeczytaj to jako cóż.

  1. Zawsze używaj HTTPS

    • uniemożliwia atakującym odczytanie pliku cookie identyfikatora sesji
  2. Enable session.use_strict_mode:

  3. Enable sessions.use_only_cookies i wyłącz session.use_trans_sid

    • użytkownik udostępnia identyfikator sesji przypadkowo, udostępniając adres URL z identyfikatorem sesji w nim
    • zapobiega pojawianiu się ID sesji w nagłówku Referer
  4. Okresowo regeneruje identyfikator sesji i unieważnia stare identyfikatory sesji krótko po regeneracji

    • Jeśli atakujący użyje identyfikatora sesji innego użytkownika, regeneracja unieważni sesję użytkownika lub atakującego, w zależności od tego, które żądanie regeneruje Dowód osobisty. Następnie można śledzić, gdy ktoś próbuje użyć sesji, która została już zregenerowana, i Unieważnić zregenerowaną sesję w tym momencie. Użytkownik będzie mógł się zalogować, ale atakujący (miejmy nadzieję) nie będzie w stanie.
  5. Opcjonalnie śledź dodatkowe informacje w $_SESSION, które odnoszą się do żądania (adres IP, ciąg agenta użytkownika itp.)

    • Jeśli atakujący w jakiś sposób uzyska dostęp do identyfikatora sesji, może to wykryć włamanie zanim atakujący uzyska dostęp do jakichkolwiek danych. Należy jednak pamiętać, że może to pogorszyć wrażenia użytkownika. Na przykład adres IP może ulec zmianie, gdy użytkownik przełączy się z sieci komórkowej na Wi-Fi, a ciąg agenta użytkownika może ulec zmianie, gdy jego przeglądarka zostanie automatycznie zaktualizowana. Dostosuj sprawdzane dane do kompromisów, z którymi Twoja witryna jest gotowa sobie poradzić.
 25
Author: 0b10011,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-05 18:10:30

Odpowiedź na to pytanie wymaga 2 podejść:

  1. Identyfikatory sesji PHP są wystarczająco trudne do odgadnięcia dla większości przypadków użycia. Nie dużo trudniejsze lub mniej trudne niż inne powszechnie stosowane systemy.

  2. Zaufanie tylko do pliku cookie sesji (i tylko do istnienia pliku cookie sesji) wydaje mi się nie iść zbyt daleko pod względem bezpieczeństwa, bez względu na to, skąd pochodzi ten plik cookie sesji-PHP lub gdzie indziej.

W skrócie: sesje PHP są tak bezpieczne, jak ich użycie czyni je be. Dotyczy to każdego znanego mi systemu opartego na plikach cookie sesji.

 5
Author: Eugen Rieck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-15 19:50:53

Jeśli zrobisz to:

$_SESSION['user'] = $username;

Wtedy $username nie będą bezpośrednio przechowywane w pliku cookie. Zamiast tego unikalny identyfikator sesji zostanie wygenerowany i zapisany w pliku cookie.

Informacje, które przechowujesz w {[2] } są przechowywane tylko po stronie serwera i nigdy nie wysyłane do klienta. Na kolejne żądanie klienta serwer załaduje dane sesji według identyfikatora przechowywanego w pliku cookie, gdy to zrobisz session_start().

Jest stosunkowo bezpieczny. Jedyną rzeczą, która może się zdarzyć, jest to, że ktoś może przechwycić sesję id, a tym samym ukraść prawdziwą sesję użytkowników. HTTPS może temu zapobiec.
 3
Author: d_inevitable,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-15 19:49:56

Jakąkolwiek odpowiedź otrzymasz na ten temat, najprawdopodobniej nie będziesz zadowolony, ponieważ istnieje tak wiele różnych opinii na ten temat. Istnieją nawet całe książki napisane o sesjach i bezpieczeństwie PHP w ogóle.

Najlepszą odpowiedzią, jaką możesz mieć nadzieję uzyskać, jest prawdopodobnie "sesje są tak bezpieczne, jak chcesz, aby były". Więcej pracy i większa liczba środków ostrożności oczywiście uczyni je bezpieczniejszymi w użyciu, ale sama realizacja pochłonie więcej czasu. Jak ze wszystkim jesteś jednym, aby zmierzyć, ile bezpieczne jest wystarczająco bezpieczne dla Twoich potrzeb.

 1
Author: brezanac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-15 20:05:16

Ponieważ jesteś programistą C++, musisz tylko wiedzieć, że sesja widoczna po stronie klienta jest tylko wskaźnikiem na innej przestrzeni adresowej (serwerze) i dlatego sesja nie może być dostępna z trybu klienta.

 0
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-21 15:32:05