Vorrei discutere con voi un po di mie idee(lo so sono un po esagerato come idee )sull'ottimizzazione delle sessoni e queste sono le cose che vorrei fixxare rispetto al classico utilizzo(base)delle sessioni:

1) Evitare il session hacking(questo articolo è ottimo se non sapete esattamente cosa intenda http://www.acros.si/papers/session_fixation.pdf),ovviamente ci sono molti modi

2) Evitare il session hacking via XSS

3) Creare sessioni SOLO se servono(solo se l'utente si è loggato correttamente,è inutile tenere 100000 sessioni vuote per utenti che hanno aperto 1 volta la pagina)ed eliminarle al logout

4) evitare che siano attive piu di una sessione per utente(senza qualche controllo sulle attivita le sessioni standard lo permettono)ed eliminare completamente le sessioni vecchie o scadute

ovviamente qualsiasi soluzione deve avere impatto prestazionale bassissimo(se non migliorare le performance)e deve evitare di usare configurazioni non standard o toccare configurazioni(poichè hosting poco permissivi bloccano praticamente tutte le modifiche a settaggi avanzati).

soluzioni(ne ho gia tante in mente il problema è che sono troppe):

aprire le sessioni solo nelle funzioni che le usano e chiuderle subito dopo(in MACROCODICE php):

Codice PHP:
function login(user,pwd){
  if(
islogged()==1)//se è gia loggato perchè rifà il login?ESCO subito dalla funzione
     
return 'gia loggato';
  if(!
LOGIN_CORRETTO){//login errato la sessione non è piu valida
     
session_destroy();//distruggo anche cookie utente?come?
    
return $tipo_errore;
  }
  if(
GIA_LOGGATO)//l'algoritmo di questa funzione andra discusso dopo
      
DISTRUGGI_VECCHIA_SESSIONE();

  
SETTA_NUOVA_SESSIONE_COME_ATTIVA();//setto la sessione corrente come valida cosi da indicare che questa è l'unica sessione da cui l'utente deve poter accedere
  
  
session_regenerate_id(true);//la rigenero cosi evito il session hacking(se l'attaccante ha forzato la sessione X la elimino e uso un'altra sessione)
  //Setto i dati
  
$_SESSION['user']=$username;
  
//...setto altre variabili utente...

  
session_write_close();//è utile chiudere esplicitamente o è meglio come performance tenerla aperta(dovrebbe aprire il file di sessione ogni volta e funzioni come islogged etc.vengono usate MOLTE volte in una pagina)
}

  function 
islogged(){
  
session_start();
  if(!isset(
$_SESSION['user'])){//NON LOGGATO
     
session_destroy();//non sei loggato non mi serve la sessione
  
return false();
  }
  
session_write_close();

Ora il problema che si pone è come implementare ottimizzando le performance la funzione GIA_LOGGATO.
I metodi primari sono due:
- Array: il metodo di login è in una classe che viene salvata su un file di cache cosi da salvare i valori ottimizzando le performance,creando un array nella classe il cui indice è il numero di sessione e il valore è l'username l'implementazione è banalissima.

- Tabella mysql:creando una tabella con due campi senza duplicati session_id e username,utilizziamo ovviamente una tabella MEMORY che è molto prestazionale.

Analizzando i due metodi ovviamente è chiaro che il metodo dell'array utilizzera molto tempo ogni volta che bisogna modificare l'array(il file dev'essere riscritto totalmente)e un po di tempo(che comunque andrebbe gia svolto)per rileggersi tutto il contenuto del file.
ricordo che l'utilizzo dell'array implica un tempo di caricamento maggiore della classe anche se non lo utilizziamo.
L'utilizzo di mysql d'altro canto necessita una query in piu ma si potrebbe ottimizzare il tutto includendola nella query che viene eseguita per controllare user e pwd in questo modo:

SELECT * FROM users JOIN session on (users.username=session.username)

Cosi facendo avremo tutti i dati dell'utente come richiesto da normale login e IN PIU con un minimo carico di mysql avrevo pure tutte le sessioni attive per l'utente,detto cio bastera controllare se la sessione è attiva e se attiva(e il login risultasse corretto)basta aggiornare quel campo.

In tutte e due i casi ovviamente dopo il controllo se risultasse una sessione vecchia bisognerebbe cancellarla fisicamente ANCHE SUL SERVER;ma come fare?
session_destroy() non puo distruggere una sessione con id specificato e inoltre il file di sessione sul server rimane intoccato.
non capisco perchè siano state implementate cosi le sessioni,se la distruggo non dovrei piu vederla fisicamente ne sul server ne su cookie utente;l'hanno fatto per performance(cosi da non dovere ricreare nuovi file per nuove sessioni)?per qualche altro oscuro motivo di sicurezza?!??
saro troppo fissato :berto: ma a me non piace vedere 10000 file in /tmp solo perchè ho aperto un po di volte il browser.

P.S.:scusate per la lunghezza del discorso e se le domande non sono esattamente domande ma anche mezze risposte! :master: