2012-05-12 15 views
8

Attualmente ho il seguente codice per OGNI pagina sul mio sito web. Per favore qualcuno potrebbe confermare se questa è una buona pratica per iniziare e continuare una sessione PHP?Sessione PHP veloce ed efficiente

//************************************************************ 
//Session Settings 
//************************************************************ 

$session_name = 'PHPSESSID'; 
$session_exp_time = 10000; 

$previous_name = session_name($session_name); 

//Set garbage collection parameters 
ini_set('session.gc_maxlifetime', $session_exp_time); 
ini_set('session.gc_probability', '1'); 
ini_set('session.gc_divisor', '100'); 

ini_set('session.name', $session_name); 
ini_set('session.cookie_domain', ''); //Session set to not be available to subdomains 
ini_set('session.cookie_lifetime', 0); 

//Set the session cookie parameters 
session_set_cookie_params($session_exp_time, '/', ''); 

//Start or continue a session... 
@session_start(); 

if (isset($_COOKIE[$session_name])) 
setcookie($session_name, $_COOKIE[$session_name], 2147483647, ''); 

Si prega di notare che questo script è incluso in OGNI pagina.

Un'altra domanda correlata:

Devo impostare una sessione personalizzata percorso di salvataggio o devo semplicemente usare la sessione di default del server Salva percorso? Quali sono i pro e i contro? Da quanto ho capito, se non si imposta un percorso di salvataggio sessione personalizzato, è probabile che si possa avere qualche tipo di conflitto su un hosting condiviso? Per favore aiutami a chiarire.

Grazie in anticipo!

+1

Hai accesso al php.ini del server? O supporta i file .htaccess? Se è così, molte di quelle voci ini possono andare. –

+1

Puoi anche inserirlo in un file php incluso in modo da includere solo il file ogni volta, non tutto il codice ogni volta. A meno che tu non lo stia già facendo. E come @Jack ha detto php.ini o htaccess sono altri luoghi in cui puoi aggiungere quel codice. Tuttavia, se lo si inserisce nel proprio file php e lo si include una volta per pagina, questo è un buon metodo anche in questo modo si effettua 1 modifica in 1 file e si aggiorna automaticamente ovunque venga fatto riferimento al file. – Danny

risposta

5

Molte delle tue istruzioni riguardano impostazioni di configurazione della sessione; quelli di solito possono essere spostati nel server php.ini o in un livello superiore .htaccess (Apache).

session.name = PHPSESSID 
session.gc_maxlifetime = 10000 

session.gc_probability = 1 
session.gc_divisor = 1000 

session.cookie_domain = 
session.cookie_path =/
session.cookie_httponly = 1 
session.cookie_lifetime = 0 

Non si dovrebbero fare sessioni durate quanto si fa (scadenza nel 2038); le sessioni vengono normalmente perpetuate con i cookie di sessione (che durano fino alla chiusura del browser, tecnicamente). Se si desidera implementare una funzione "ricordami", ti suggerisco di aggiungere quella in cima alle tue sessioni, come spiegato qui: http://jaspan.com/improved_persistent_login_cookie_best_practice

Trovo importante distinguere tra l'avvio di una nuova sessione e il riprenderne uno esistente, in particolare nei casi in cui le sessioni vengono create solo come parte di un processo di accesso. Quando non è possibile riprendere una sessione, qualcosa è andato storto e l'utente deve essere reindirizzato alla pagina di accesso (o alla home page).

PHP non capisce questa differenza, session_start creerà automaticamente una sessione se non è presente e, peggio, se viene fornito un ID di sessione arbitrario; quest'ultimo consente attacchi per l'adozione di sessioni come descritto qui: http://gihyo.jp/dev/serial/01/php-security/0025 - è in giapponese, dovrai tradurlo con il tuo browser.

Per scoprire se è possibile riprendere una sessione, è necessario eseguire il primo riempimento di ogni nuova sessione aggiungendo una chiave speciale (ad esempio $_SESSION['_id'] = session_id()). Se tale chiave viene trovata, la sessione esiste già e puoi riprenderla; se no, la sessione o non esisteva o qualcuno sta cercando di fornirti un ID sbagliato.

Per iniziare una nuova sessione, è necessario prima vedere se è possibile riprenderla; in caso contrario, si utilizza session_regenerate_id(true) per modificare l'ID di sessione (questo rende più difficile per un utente malintenzionato dirottare una sessione).

Infine, i percorsi di salvataggio di sessione su un server condiviso possono essere scritti nella propria cartella Inizio, ma ciò ha senso solo se l'host condiviso viene eseguito con un utente dedicato per host virtuale (ad esempio suexec). Altrimenti, per proteggere la tua sessione dagli attacchi di snooping dovrai codificare i dati della sessione (e forse anche le chiavi). Controlla l'estensione mcrypt: http://sg.php.net/mcrypt - dovresti riuscire a trovare esempi online.

Spero che questo più o meno risponda alla tua domanda. Fammi sapere se pensi che qualcosa non va.

+0

Grazie per aver trovato il tempo di aiutare, Jack. Apprezzo molto. Ho difficoltà a sapere se la sessione può essere ripresa o meno. Ho provato a usare: if (session_id() == '') per vedere se la sessione è iniziata, ma restituisce sempre TRUE, anche se la sessione è già iniziata? –

+0

È sempre possibile chiamare session_start(), quindi verificare la presenza di una chiave in quella sessione come descritto, ad esempio isset ($ _ SESSION ['_ started']) –

Problemi correlati