PER FAVORE, ABBIATE MOLTA PAZIENZA!
Premessa:
In php.ini ho le seguenti impostazioni:
PATH DELLE SESSIONI, USO QUELLO DI DEFAULT, QUINDI C:/WINNT/TEMP
; Whether to use cookies.
session.use_cookies = 1
; This option enables administrators to make their users invulnerable to
; attacks which involve passing session ids in URLs; defaults to 0.
session.use_only_cookies = 1
; Lifetime in seconds of cookie or, if 0, until browser is restarted.
session.cookie_lifetime = 0
session.gc_probability = 100
session.gc_divisor = 100
; After this number of seconds, stored data will be seen as 'garbage' and
; cleaned up by the garbage collection process.
session.gc_maxlifetime = 600
Nella mia index.php non c'è session_start();
Nella index se un utente vuole accedere all'area riservata, deve inserire login e password. La form, poi, invia tali dati alla pagina area_ris.php, dove viene creata la sessione:
session_start();
in essa sono memorizzate login e password;
si controlla se tali dati sono presenti nel DB. Se si accedi, altrimenti ritorna in index.php
In ogni pagina, interna, viene fatto il controllo se la login e la password presenti nella sessione siano valide o meno.
Ora, quello che a me interessa è questo.
Nelle pagine interne, io VOLGIO RINNOVARE una sessione esistente SOLO SE la sessione è EFFETTIVAMENTE ESISTENTE, altrimenti rimando alla pagina index.php. Il tutto per motivi di sicurezza.
Secondo le mie impostazioni del php.ini, la sessione esiste solo se il client invia un cookie di sessione *e* esiste il file di sessione corrispondente.
Nelle pagine, interne, ho sostituito session_start() con un include al seguente file:
<SCRIPT LANGUAGE="php">
if (!isset($_COOKIE['PHPSESSID']))
{
//No cookie from client.
//Invio un e-mail per il possibile tentativo di intrusione dicendo che DAL BROWSER
//DELL'UTENTE NON È PERVENUTO ALCUN COOKIE
TORNO ALL'INDEX.PHP
}
$GLOBALS['sv'] = (string) $_COOKIE['PHPSESSID'];
if (preg_match('/^[-,a-zA-Z0-9]+$/', $GLOBALS['sv']) !== 1)
{
//Not a valid cookie syntax.
//Invio un e-mail per il possibile tentativo di intrusione dicendo che DAL BROWSER
//DELL'UTENTE È PERVENUTO UN COOKIE CON ID DI SESSIONE NON VALIDO
TORNO ALL'INDEX.PHP
}
$GLOBALS['dir'] = "C:/WINNT/Temp/sess_";
$GLOBALS['sf'] = $GLOBALS['dir'] . $GLOBALS['sv'];
if (!file_exists($GLOBALS['sf']))
{
//This cookie is not a session or session expired.
//Invio un e-mail per il possibile tentativo di intrusione dicendo che DAL BROWSER
//DELL'UTENTE È PERVENUTO UN COOKIE CHE NON CORRISPONDE AD UNA SESSIONE
//OPPURE LA SESSIONE E' SCADUTA
TORNO ALL'INDEX.PHP
}
//Se la sessione corrente è scaduta, ne cancelliamo il relativo file
$GLOBALS['time_out'] = ini_get('session.gc_maxlifetime');
if (time() - $GLOBALS['timeOut'] > fileatime($GLOBALS['sf']))
{
/* Se l'ultimo accesso al file supera il tempo di vita della sessione, allora il file viene
distrutto */
unlink($GLOBALS['sf']);
}
else
{
/* A questo punto abbiamo tale situazione: esiste il cookie di sessione dell'utente ma
anche il file di sessione sul server. Ora, nella frazione infinitesimale di tempo che è
intercorso tra l'if precedente e l'istruzione session_start() è probabile (anche se è
quasi impossibile) che la sessione sia scaduta. In tal casi, session_start() provoca o
potrebbe, la creazione di una nuova sessione: in tal caso si entra nell'if seguente, si
distrugge la sessione e si ritorna nell'index.
Invece, se non si entra nell'if allora vuol dire che abbiamo ripreso la sessione
dell'utente corrente */
session_start(); //restore session.
if (session_id() !== $GLOBALS['sv'])
{
//Invio un e-mail per il possibile tentativo di intrusione dicendo che DAL BROWSER
//DELL'UTENTE È PERVENUTO UN COOKIE PER IL QUALE LA SESSIONE E' SCADUTA
TORNO ALL'INDEX.PHP
}
}
//The restored session is that we actually expected.
</SCRIPT>
Ho dato, inoltre, un'occhiata a queste 2 discussioni
http://forum.html.it/forum/showthrea...n&pagenumber=3
dove andr3a ha suggerito l'uso del DB con riferimento a tale link http://www.devpro.it/code/94.html
mentre Piero gestisce direttamente i file di sessione nella loro cartella (da lui ho preso spunto per la cancellazione del file di sessione scaduto - non sono Gay!!!)
ed anche la discussione http://forum.html.it/forum/showthrea...readid=1095247
dove anche qui si suggerisce l'uso di DB rimandando a tale link
http://blog.studio-blue.it/2007/02/p...entazione.html
Non posso far uso di DB, perché sul mio server vi sono vari servizi offerti alla clientela, ciascuno dei quali è implementato con un DB separato dagli altri.
Visto l'elevato numero di utenti che accede al Server, sarebbe, quindi, impensabile avere un DB a parte per le sessioni, in quanto ad ogni pagina dovrei aprire la connessione con il DB delle sessioni, poi riprendere la connessione con il DB del servizio specifico per il controllo della validità del log-in, poi riprendere la connessione con il DB delle sessioni se devo memorizzare qualche variabile, poi, eventualmente, riprendere la connessione con il DB del servizio se nella pagina php devo visualizzare dei dati da prendere nel DB............. diventa, inefficiente, anche
perché i vari DB si trovano su macchine differenti dal web-server.
La mia domanda è se il metodo da me proposto appesantisce troppo il server o comunque sia poco sicuro o inefficiente.
SE VERAMENTE IL GARBAGE COLLECTOR FUNZIONASSE E CANCELLASSE I FILE DI SESSIONE ALLA LORO SCADENZA, TUTTI I MIEI PROBLEMI SAREBBERO RISOLTI!!!!
CONSIGLIATEMI!