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é 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?
Risposte:
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.
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.
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:
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:
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).
session_regenerate_id
?Dovresti usarlo per prevenire la fissazione della sessione .
session_regenerate_id
?Ogni volta che lo stato di autenticazione cambia, si tratta principalmente di login e logout.
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 httpOnly
flag per impedire l'accesso tramite javascript). Immaginiamo che Stack Overflow avesse HTTPS sempre abilitato e anche il secure
flag 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.
session_regenerate_id()
rilasciata, Alice può accedere all'account Bob? è giusto?
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.
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.