Quando e perché dovrei usare session_regenerate_id ()?


95

Perché e quando dovrei usare la session_regenerate_id()funzione in php? Dovrei usarlo sempre dopo aver usato il session_start()? Ho letto che devo usarlo per impedire il fissaggio della sessione, è questo l'unico motivo?


perchè dopo l'inizio della sessione viene creato il viene e sull'altra pagina quando si avvia la sessione sono presenti le variabili: -
HaRsH

@HaRsH Oo? Session_regenerate_id rimuove il vecchio ID sessione e ne crea uno nuovo per evitare di dirottare la sessione con XSS, ad esempio. Non ha alcun effetto sulla visibilità delle variabili SESSION in altri documenti.
Xatenev

si lo so che non ho alcun effetto su altre variabili ma se non avvii la sessione sulla pagina lì le variabili non sono presenti su quella pagina nel core php
HaRsH

1
Ma si tratta di session_regenerate_id, non di session_start ...
Xatenev

1
Suggerirei di leggere l'RFC dove è stato proposto: wiki.php.net/rfc/precise_session_management
jankal

Risposte:


96

Che cos'è session_regenerate_id()?

Come dice il nome della funzione, è una funzione che sostituirà l'ID della sessione corrente con uno nuovo e manterrà le informazioni sulla sessione corrente.

Che cosa fa?

Aiuta principalmente a prevenire attacchi di fissazione della sessione. Gli attacchi di correzione della sessione sono i casi in cui un utente malintenzionato tenta di sfruttare la vulnerabilità in un sistema per correggere (impostare) l'ID di sessione (SID) di un altro utente. In questo modo, avranno accesso completo come utente originale e saranno in grado di eseguire attività che altrimenti richiederebbero l'autenticazione.

Per prevenire tali attacchi, assegna all'utente un nuovo ID di sessione utilizzando session_regenerate_id()quando accede con successo (o per ogni X richieste). Ora solo lui ha l'ID di sessione e il tuo vecchio ID di sessione (corretto) non è più valido.

Quando dovrei usarlo session_regenerate_id()?

Come sottolinea Symbecean nei commenti seguenti, l'id di sessione deve essere modificato in qualsiasi transizione nello stato di autenticazione e solo durante le transizioni di autenticazione.

Ulteriore lettura:


2
E cosa succede se l'hacker effettua la 20a chiamata? L'ID della sessione è cambiato ed è l'unico a possedere la sessione;))
fred727

@ fred727 Se l'hacker ha la fortuna di raggiungere la 20a chiamata, l'utente avrà un ID non valido e non verrà più autenticato. Senza la rigenerazione, sia l'hacker che l'utente sarebbero autenticati.
Bradmage

potrebbe anche essere utile chiamare session_regenerate_id quando si memorizzano informazioni sensibili nelle sessioni (quindi non solo nelle tansizioni di autenticazione)
Adam

È possibile fissare la sessione se le informazioni sulla sessione non sono in un cookie? Sto memorizzando le informazioni sulla sessione in file nel mio server, è necessario rigenerare l'id?
Gonzalo

"per fissare (impostare) l'ID di sessione (SID) di un altro utente" .... questo dovrebbe essere sostituito con "per fissare (impostare) un ID di sessione (SID) sul computer di un altro utente, quindi usarlo dopo averlo autenticato "
Accountant م

25

Dovresti usare session_regenerate_id()per fermare il dirottamento della sessione e la correzione della sessione .

Da questa risposta Security.SE :

Il dirottamento di sessione si riferisce al furto del cookie di sessione. Questa operazione può essere eseguita più facilmente quando si condivide una rete locale con altri computer. Ad esempio da Starbucks. Esempio ... un utente con la sessione Y sta visitando il sito Web di James su Starbucks. Sto ascoltando il loro traffico di rete, sorseggiando il mio latte. Accetto i cookie di sessione Y per il sito Web di James e imposto il browser per utilizzarli. Ora, quando accedo al sito di James, il sito di James.

Da questa pagina web :

La correzione della sessione è una tecnica di attacco che forza l'ID di sessione di un utente a un valore esplicito. A seconda della funzionalità del sito Web di destinazione, è possibile utilizzare una serie di tecniche per "correggere" il valore dell'ID di sessione. Queste tecniche vanno dagli exploit di Cross-site Scripting al infarcire il sito web con richieste HTTP fatte in precedenza. Dopo che l'ID di sessione di un utente è stato corretto, l'attaccante attenderà che l'utente effettui il login. Una volta che l'utente lo fa, l'aggressore utilizza il valore dell'ID di sessione predefinito per assumere la stessa identità online.

Quando usare

Quando l'utente modifica / aggiorna alcuni input importanti (modifica di password, credenziali, password dimenticate ecc.) Che potrebbero compromettere la sicurezza del sito o la politica sulla privacy.

Guarda anche:

Guida alla sicurezza PHP: sessioni

Fissazione della sessione (bella lettura)


22

Penso che la questione dell'avvelenamento da sessione sia stata trattata abbastanza bene.

Per rispondere al "Quando dovrei usarlo?" parte, è importante fare un passo indietro e considerare cosa sta facendo l'applicazione con la sessione. O, per dirla in altro modo, questa è la domanda di sicurezza chiave a cui devi rispondere

Se qualcuno riuscisse a controllare questa sessione, cosa guadagnerebbe?

Se tutto ciò che fai è tenere traccia di dati altrimenti anonimi (l'utente arriva sul sito e lo usi per monitorare le sue visite), allora non c'è motivo di rigenerare una sessione. Un dirottatore non guadagnerebbe nulla di valore afferrando quella sessione.

Tuttavia, molti siti offrono accessi. Un accesso cambia molte cose. Posso accedere al mio profilo. Posso modificare le impostazioni. Quindi un dirottatore potrebbe richiedere l'accesso al mio account, specialmente se gli utenti normali e amministratori utilizzano tutti le sessioni per gestire l'accesso. Quindi, quando le persone vengono sul mio sito e accedono, rigenero la sessione. Aggiunge un ulteriore livello di sicurezza che il mio utente appena connesso ha meno probabilità di essere dirottato.

Ogni volta che aggiungiamo dati critici a una sessione, dovresti considerare di rigenerare l'ID sessione. Se hai bisogno di rafforzare la tua applicazione contro la fissazione, una rigenerazione casuale può essere utile, ma non la rigenererei MAI ad ogni richiesta. Per impostazione predefinita, PHP memorizza le sessioni in file sul disco locale. Stai aggiungendo molto I / O del disco per mitigare quello che è un vettore di attacco relativamente piccolo. Se hai davvero bisogno di maggiore sicurezza, ti consiglio di utilizzare HTTPS completo anziché rigenerare regolarmente (HTTPS rende la fissazione molto difficile da eseguire).


2
HTTPS non cambia nulla sulla fissazione.
kelunik

4
Ma rende più difficili gli attacchi di sniffing che potrebbero essere utilizzati per ottenere l'ID di sessione in primo luogo.
demonkoryu

la mia app php si disconnette in pochi secondi, sto usando la rigenerazione, c'è un limite di file di sessione che possono essere creati o c'è un limite agli ID rigenerati che potrebbero causare il logout?
sqlchild

Non generalmente, no. Potresti postare una domanda separata a riguardo
Machavity

16

Perché dovrei usare session_regenerate_id?

Dovresti usarlo per prevenire la fissazione della sessione .

Quando dovrei usarlo session_regenerate_id?

Ogni volta che lo stato di autenticazione cambia, si tratta principalmente di login e logout.

Esempio

Bob si siede su un computer pubblico e sfogliando stackoverflow.com apre una nuova sessione lì. L'ID di sessione viene salvato in un cookie (con httpOnlyflag per impedire l'accesso tramite javascript). Immaginiamo che Stack Overflow avesse HTTPS sempre abilitato e anche il secureflag impostato per il cookie.

Come possiamo rubare la sessione adesso?

Bob annota l'ID della sessione. Lascia il computer senza chiudere il browser. Ora Alice arriva su questo computer e vede che Stack Overflow è già caricato. Accede ora.

Ora siamo nella fase in cui dovresti usare session_regenerate_id. Se non crei un nuovo ID di sessione qui durante l'accesso, Bob potrebbe utilizzare la sessione precedente che aveva annotato per accedere alla sessione di Alice e ora sarebbe loggato come Alice.


Ma fino a quel momento in cui la session_regenerate_id()rilasciata, Alice può accedere all'account Bob? è giusto?
Akam

2
@akam - È tardi, ma vale la pena rispondere ... 1. Bob non si disconnette, Alice può usare il suo login - 2. Bob si disconnette, Alice non si connette, Alice può usare il suo ID di sessione, ma non c'è un login attivo per accedere ai suoi dati - 3. Bob si disconnette, Alice accede, Bob usa l'ID di sessione, c'è un login attivo, Bob accede ai dati di Alice. Ma per essere precisi: dipende dalla sicurezza degli script un ID di sessione non significa necessariamente che puoi accedere ai dati di un utente disconnesso, ma generalmente parlato è un possibile e ad alto rischio.
codekandis

15

Puoi usarlo per una migliore sicurezza.

In questo modo crei ID di sessione per un utilizzo occasionale.

Supponiamo che il tuo ID sessione utente sia = 3

Alcuni hacker hanno violato il tuo client e hanno ottenuto il loro session_id. Quindi l'hacker può utilizzare quel cookie per utilizzare la propria sessione.

Se hai un codice come

session_start();
session_regenerate_id();

puoi cambiare la loro sessione ogni volta che utilizzano il tuo sito web.

Ora l'hacker ottiene sessionid = 3

ma hai cambiato sessione dopo averlo usato, quindi il tuo

l'utente ha sessionid = 4 // auth

l'hacker ha session = 3 // null

Ma c'è un piccolo punto diciamo che stai usando il metodo di rigenerazione e il tuo client accede al sito web e chiudi il browser o è inattivo. Il tuo client ha sessionid = 4 e se l'hacker ottiene i cookie in quella parte, avrà lo stesso sessionid.

Come spiegato sopra, in questo modo puoi proteggere il tuo client dallo sniffing dei dati in un modo, ma ancora non risolverà questo problema per sempre.

Ma sarà molto sicuro se usi SSL enc.

Scusa per il pessimo inglese.


12

Un semplice caso d'uso:

// User visits a webshop
$shopcart = new Cart();

Viene avviata una sessione e viene inserita una voce nel database. Il carrello dell'utente viene identificato dal suo ID di sessione.

// User orders items
$shopcart->add('123', 20);
$shopcart->add('124', 18);
$shopcart->add('127', 5);

Per ogni prodotto aggiunto, viene registrato un record nella tabella del mio carrello. Identificato anche dall'id di sessione.

// User saves cart in order to use it later
$shopcart->save();

L'utente ha deciso di salvare il suo carrello. Ora viene allegato al suo ID utente.

// Regenerate session id for user to be able to make a new cart
session_regenerate_id();

L'ID della sessione viene rigenerato e l'utente può ora ricominciare a creare un altro carrello.


4

session_regenerate_id (): Impossibile rigenerare l'ID di sessione - la sessione non è attiva

if(session_status() == PHP_SESSION_ACTIVE)
{
    session_regenerate_id();
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.