Pytanie Czy sesja php jest niezmienna od końca użytkownika? [duplikować]


To pytanie już zawiera odpowiedź:

Tworzę własną aplikację, która wymaga logowania użytkownika. Wszyscy użytkownicy i hasła (zaszyfrowane) są przechowywane w bazie danych. Gdy użytkownik próbuje się zalogować, szuka w bazie danych nazwy użytkownika i hasła. Jeśli wszystko jest w porządku, to przechowuję username w $_SESSION["username"], użytkownik role (admin, autor itp.) w $_SESSION["role"] i użytkownika website w $_SESSION["website"] (Potrzebuję przechowywania strony internetowej, ponieważ aplikacja jest jak "multisite" - moja aplikacja jest hostowana na hostingu klienta, ale administracja jest na moim serwerze).

Czytam to Czy użytkownik może zmienić wartość $ _SESSION w PHP? i nie rozumiem. Czy ta metoda jest bezpieczna (przechowywania danych i jeśli użytkownik jest zalogowany) w $_SESSION?

Czy użytkownik może zmienić treść sesji? (na przykład, jeśli użytkownik jest zalogowany i $_SESSION["website"] to "example.com", czy użytkownik może zmienić sesję $_SESSION["website"] do "example.org", aby zrujnować inną stronę internetową? Jeśli tak, jak uniknąć lub jaka jest bezpieczna alternatywa sesji?).

I proszę powiedz mi, co to jest porwanie sesji i jak może to wpłynąć na moją witrynę, a także, w jaki sposób sprawić, by session_id mógł się zmienić?

Dziękuję bardzo!


18
2018-06-11 05:35


pochodzenie


Nie. $ _SESSION jest zapisywane na serwerze .. a $ _COOKIE jest zapisywane na końcu przeglądarki. - kd0807
Przejmowanie sesji: stackoverflow.com/questions/12233406/... - Drakes
Zaczekaj, przechowujesz zaszyfrowane hasła? - Ismael Miguel
Ale przechowujesz zaszyfrowane hasła w bazie danych? - Ismael Miguel
O to mi chodziło. Proszę, zdejmij szyfrowanie i użyj funkcji mieszania, np sha1z solą. Możesz chcieć spojrzeć na password_hash funkcja (php.net/manual/en/function.password-hash.php). Następnie albo sprawdź, czy hash jest taki sam (przez ponowne mieszanie i sprawdzanie z ===) lub, w zależności od wersji PHP i użytej funkcji skrótu, możesz użyć tej funkcji password_verify (php.net/manual/en/function.password-verify.php) - Ismael Miguel


Odpowiedzi:


$ _SESSION jest zapisywane na serwerze, więc użytkownik nie może go modyfikować (z wyjątkiem przypadku przechwycenia sesji)


10
2018-06-11 05:42



Ale sesja nie jest przechowywana w broser, jako plik cookie? - MM PP
@MMPP Plik cookie jest przechowywany w przeglądarce, ale jest używany jako łącze do sesji (więc myślę, że można "zmienić" na inną sesję "). Same dane są przechowywane na serwerze. - Los Frijoles
Rozumiem, dziękuje! Ale czym jest porwanie sesji? Jak ominąć? - MM PP
@MM PP Na przykład unikaj wyświetlania $ _SESSION ['hasło;'] w dowolnym miejscu kodu lub jeśli twój kod ujawnia PHPSESSID, ponieważ jest przechowywany w cookie przeglądarki - kd0807
Przechwytywanie sesji w usłudze @MMPP to sytuacja, w której użytkownik może zobaczyć plik cookie innego użytkownika, a następnie może zmienić własny plik cookie sesji, tak aby był zgodny z sesyjnym plikiem cookie innego użytkownika i korzystać z sesji tego użytkownika. - immibis


Session () jest po stronie serwera, jak odnotowano @ kd0807. Aby uzyskać więcej informacji na temat przechwytywania sesji i utrwalania:

Dygresja... Przy ilości zmiennych zalecam tablicę dla sesji ['user']. przykład....

$_SESSION['user'] => Array(
'userid'=> '123',
'username'=> 'some_joe',
'role' => 'customer', // user, customer, admin, moderator etc.
'website' => 'http://www.example.com'
);

// reading variables from array
$userid = $_SESSION['user']['userid'];
$username = $_SESSION['user']['username'];
// etc. etc.

Oto 3 bardzo uproszczone funkcje, z których korzystam.

// determine if session has started
Function HasSessionStarted() {

    $result = false; // default to false

    // Check if session has started
    IF ((session_status() == PHP_SESSION_NONE) || (session_id() == '')) { 
        $result = true; 
    }

    return $result;

}

// Set a session value
Function Set_Session($name, $value) {
    /* @params value: can be a string or an array */
    $new_session = HasSessionStarted(); // Check Session Status

    IF ((isset($name)) && (isset($value))) {
        IF ($new_session) { session_start(); }
        $_SESSION[$name] = $value;
        IF ($new_session) { session_write_close(); }
    }

}

Function Unset_Session($name) {

    $new_session = HasSessionStarted(); // Check Session Status

    IF (isset($_SESSION[$name])) {
        IF ($new_session) { session_start(); }
        unset($_SESSION[$name]);
        IF ($new_session) { session_write_close(); }
    }

}

5
2018-06-11 06:01



Dziękujemy za udostępnienie Twojego kodu. Jest to dla mnie przydatne. +1 - MM PP
Tak fajny pomysł z tablicą sesji. Dziękuję Ci. - MM PP
Nigdy nie zapominaj o programistach array (). Najłatwiejszy (najlepszy) sposób przekazywania wielu wartości z funkcji do funkcji. - Brian


Nie, dopóki sam kod php nie ujawni sesji PHP, która może być użyta do kradzieży sesji, a sesja nie może zostać zmieniona od końca użytkownika, dopóki nie zostanie wprowadzona przez ciebie sama funkcja, aby zmienić sesję z przedni koniec.


2
2018-06-11 05:42





W przeglądarce zazwyczaj znajduje się plik cookie PHPSESSID który identyfikuje sesję serwera, z której korzysta użytkownik. Jeśli użytkownik był w stanie go ukraść (dzieje się tak zazwyczaj przez Luki XSS) użytkownik może potencjalnie przejąć kontrolę nad sesją innego użytkownika.

Same dane sesji są przechowywane na serwerze i mogą być modyfikowane tylko wtedy, gdy użytkownik mógł w jakiś sposób przesłać i wykonać złośliwy skrypt na serwerze


2
2018-06-11 05:48



Jest to blokowane przez wpis DB (identyfikator sesji i IP). Porównaj pliki cookie z sesją i db. Jeśli nie pasuje ... nowy identyfikator sesji. - Brian
@Brian Zgrabny pomysł, podoba mi się - andrew
@ Brian czy możesz mi powiedzieć coś więcej na ten temat? Czy muszę przechowywać identyfikator sesji użytkownika i adres IP użytkownika w bazie danych i blokować, jeśli adres IP jest zmieniony? - MM PP
Aby odpowiedzieć na pytania prosto ... Jeśli identyfikator sesji nie pasuje do adresu IP, usuwam sesję () i rekord DB i zaczynam od nowa. Moje tabele sesji są podobne do (id [auto increment / primary], userid [medium int 15], ip [varchar 16], time [varchar 25]). Podczas ładowania strony przypisuję identyfikator sesji do $ sessid i ip do $ uip, następnie przeszukuję bazę danych dla zgodnego identyfikatora sesji i adresu IP ... WYBIERZ * Z sesji WHERE id = '$ sessid && ip = $ uip LIMIT 1 "... Jeśli wynik (prawda) porównuję znacznik czasu, rób to, co robisz ze znacznikiem czasu. - Brian
@Brian Przepraszamy za zmarnowanie twojego czasu ze mną ... ale mam pomysł, który myślę, że może zrobić to samo, ale bez potrzeby DB [jestem bardzo poważny w zakresie optymalizacji aplikacji (i najczęściej w zapytaniach DB)]. Oto mój pomysł: kiedy użytkownik się loguje, sesja przechowuje: nazwę użytkownika, stronę internetową i adres IP (jego nazwiska). Stanie się tak tylko wtedy, gdy użytkownik się zaloguje. Na każdej stronie, gdzie zwykle sprawdzam, czy sesja istnieje, teraz chciałbym ją sprawdzić, czy aktualny adres IP (który otwiera stronę) jest tym samym adresem IP, co zapisany w sesji. Czy istnieje jakikolwiek inny problem z bezpieczeństwem, który mógłby się obawiać, jeśli to zrobię? - MM PP


`$_SESSION` variables are stored in the server and hence cannot be modified by the user.

Jedną z najlepszych praktyk jest to, że musimy ciągle zmieniać session id z naszego końca.

To dlatego używamy funkcji o nazwie session_regenerate_id().

Ta funkcja zastąpi bieżący identyfikator sesji nowym i zachowa bieżące informacje o sesji, więc użycie nie zostanie wylogowane.

Aby odpowiedzieć na twoje pytanie w komentarzu:

Za każdym razem, gdy rozpoczniesz sesję, serwer odeśle plik cookie, który będzie zawierał plik cookie session id, nazwa ciasteczka będzie PHPSESSIDktóra jest domyślną nazwą. Możesz również wybrać, aby to zmienić. Tak więc ten identyfikator zmienia się, gdy używasz tego session_regenerate_id funkcjonować.

POWÓD, DLACZEGO WARTO STOSOWAĆ:

Pomaga to przede wszystkim w zapobieganiu session fixation ataki. W tym ataku złośliwy użytkownik spróbuje naprawić identyfikator sesji (SID) innego użytkownika. Jeśli mu się powiedzie, użytkownik uzyska dostęp do oryginalnego użytkownika i będzie mógł zrobić wszystko, co może zrobić legalny użytkownik.

Więc jeśli zregenerujesz session id Poprzednia old session id straci ważność

Możesz uzyskać więcej informacji na temat naprawy sesji NA STRONIE OWASP


2
2018-06-11 05:57



Dziękuję za Twój wpis. Kiedy powinienem ponownie wygenerować identyfikator sesji? Jeśli ponownie wygeneruję identyfikator sesji na każdej stronie, to czy użytkownik powinien się ponownie zalogować? - MM PP
Proszę .. sprawdź moją edycję dla twoich informacji - Abhinav
Dziękuję Ci. Teraz rozumiem... - MM PP
zawsze przyjemność :) - Abhinav


Czy użytkownik może zmienić treść sesji? (na przykład, jeśli użytkownik jest zalogowany, a $ _SESSION ["nazwa użytkownika"] to "example.com", czy użytkownik może zmienić sesję $ _SESSION ["nazwa użytkownika"] na "example.org", aby zrujnować inną stronę internetową?

Nie. Sesje są przechowywane na serwerze, więc nie można bezpośrednio zmienić sesji. Z drugiej strony wszystko zależy od programisty i od tego, jak interpretuje żądanie klienta. Na przykład robienie

$_SESSION['last_website'] = isset($_SERVER['HTTP_REFERER']) 
    ? $_SERVER['HTTP_REFERER'] 
    : $_SERVER['REQUEST_URI'];

ostatecznie zastąpiłoby $_SESSION['last_website'].


2
2018-06-11 05:42



Dobrze, rozumiem. Dziękuję Ci. +1 - MM PP
Cieszę się, że to pomogło. - sitilge


tak użytkownik nie może zmienić Zmiennych sesji...

jeśli zostanie zhakowany, może się zmienić ...

aby zmienić identyfikator, musisz uzyskać identyfikator użytkownika $_SESSION["website"] w bieżącej domenie i użyj ścisłej weryfikacji ...

W przeciwnym razie mogą zhackować ...


1
2018-06-11 05:46



Nie rozumiem, co próbujesz powiedzieć. - MM PP
jeśli chcesz zmienić sesję użytkownika, pobierz identyfikator użytkownika z adresu URL (identyfikator użytkownika musi zostać zaszyfrowany przed jego przekazaniem) i uzyskaj identyfikator, odszyfruj go i zaktualizuj sesja użytkownika - Bruce
Dobrze, rozumiem. Dziękuję za wskazówkę. - MM PP