2009-02-07 13 views
11

Sono stato interessato a come le sessioni funzionano internamente, ma ho poca conoscenza di C (e sono incerto su dove cercare il codice sorgente PHP per questo).La mia comprensione delle sessioni PHP è corretta?

Questo è quello che ho capito di sessioni in questo momento:

  1. Quando si avvia una sessione l'utente viene assegnato un ID di sessione che è memorizzato in un cookie.
  2. Quando i dati di sessione vengono salvati (tramite $_SESSION), vengono memorizzati sul filesystem, con l'id di sessione pertinente e un tempo di scadenza.

È corretto? Qual è anche il metodo con cui vengono creati gli ID di sessione? Presumo che sia basato sul tempo ma cosa succede se due utenti inviano una richiesta allo stesso tempo? Quali metodi sono in atto internamente per impedire che ottengano lo stesso id?

Grazie,

risposta

27

mia comprensione è il processo di gestione delle sessioni interna è la seguente:

Quando session_start si chiama, PHP è alla ricerca di un parametro da parte del cliente che è stato inviato tramite POST, GET, o in un cookie (a seconda della configurazione, vedere session.use_cookies, session.use_only_cookies e session.use_trans_sid) con il nome del valore di session.name per utilizzare l'ID di sessione di una sessione già avviata.

Se trova un ID sessione valido, tenta di recuperare i dati della sessione dall'archivio (vedere session.save_handler) per caricare i dati in $_SESSION. Se non riesce a trovare un ID o il suo utilizzo è vietato, PHP genera un nuovo ID utilizzando una funzione hash (vedi session.hash_function) sui dati di una fonte che genera dati casuali (vedere session.entropy_file).

Alla fine del runtime o quando viene chiamato session_write_close, i dati di sessione in $_SESSION vengono archiviati nella memoria designata.

1

L'ID di sessione è probabilmente solo una stringa casuale di lettere e numeri. Sarebbe anche strano se PHP non verificasse che è unico e quindi non può essere lo stesso per due utenti. Per quanto riguarda (1) e (2), direi che sei corretto, ma di recente non ho lavorato con PHP, quindi sentiti libero di non credermi.

15

Guarda php_session_create_id in ext/session/session.c nella fonte php

Va in questo modo:

  • ottenere ora del giorno
  • ottenere l'indirizzo IP remoto
  • costruire una stringa con i secondi e microsecondi dall'ora corrente, insieme all'indirizzo IP
  • immettere in configurazione session hash function (MD5 o SHA1)
  • se configurato, nutrono una certa casualità supplementare da un entropy file
  • generare valore hash finale

In modo da ottenere un duplicato è piuttosto difficile.Tuttavia, dovresti familiarizzare con il concetto di fissazione della sessione, che consente a un utente malintenzionato di scegliere potenzialmente il session_id che il suo target adotterà - vedi Sessions and Cookies per un buon primer.

Problemi correlati