Se un sito è destinato a molti utenti che interagiscono nello stesso momento, posso usare delle variabili generiche per fare delle operazioni o tutto ciò che è relativo ad uno specifico utente va in una variabile di sessione e si può usare solo quella?
Voglio dire: per passare informazioni da uno script php ad un altro uso le variabili di sessione, ma all'interno di uno stesso script posso fare qualcosa tipo
PHP:
$username = $_SESSION["username"];
e poi operare sempre su $username o si rischia qualche incongruenza? Perchè in fondo il server è uno e se devo fare la stessa operazione per più utenti mi troverei ad assegnare alla stessa variabile $username più valori diversi...o sbaglio?
Le sessioni sono array di dati, puoi usarli come ti serve, senza riserva
Ma in pratica si usano per due motivi principali, il passaggio dei dati da una pagina all'altra e ovviamente per ricordare i dati durante un'intera sessione di navigazione del sito da parte di un utente.
Per il secondo quesito invece devi sapere che ogni a utente ( cioè a ogni richiesta ) il server riserva un certo spazio di memoria ( in genere Apache 8 mega per il php per ogni richiesta ) e quindi ogni utente gira in quello spazio.
Tu non puoi prevedere quanti utenti gireranno sul tuo sito e non te ne devi nemmeno preoccupare, ci pensa il server a gestire la cosa.
E attento a cosa usi perché i cookie vengono sempre immagazzinati nel client se questo li accetta, se no... ciccia
( hai notato che ora tanti siti chiedono sempre di abilitarli? ) le sessioni invece sono file a solo accesso da parte del server che non vengono affatto immagazinate in locale, ma in locale c'è un riferimento alla sessione, il cosiddetto PHPSESID.
Non necessariamente le sessioni contengono i dati del cookie, anzi non lo fanno mai se non ce li metti.
@GoldenDragon
Il php usa due array separati per essi e cioè
$_SESSION mentre i cookie usano
$_COOKIE e i due dati non sono in connessione tra loro.
Inoltre $_CCOKIE può accettare poche coppie di valori ben definiti come il nome ( obbligatorio ), un valore ( lo si estrae con $_COOKIE['nome'] ), la data in cui il cookie smette di essere valido, il path dove il cookie deve agire ( all'interno del sito non del computer client ), il nome di dominio su cui agire ( sempre ottimo metterlo ) , secure ( true o false che corrispondo al protocollo https= si o https=no ) e ultimo httponly che però non è supportato da tutti browser ( se no, viene ignorato ) in pratica messo a true impedisce al javascript di accedere al cookie, in questo modo si implementa un sistema ( debole ) che dovrebbe impedire il furto di identità attraverso il cookie.
$_SESSION invece lo usi proprio come una variabile e può contenere solo una coppia nome=valore, dove valore può essere anche un altro array.
Quale dei due metodi usare dipende da ciò che si deve realizzare.
Io tendo sempre a non usare i cookie proprio perché poco sicuri dal punto della sicurezza a meno di non dover gestire cose come la cookie law, dove il cookie serve solo per sapere se hai o meno accettato la legge... per il resto vai di sessione.
Se usi le sessioni per immagazzinare un utente, non mettere mai dentro il numero o il nome che lo identifica sul database, se c'è un furto di sessione è facilissimo fregare l'account; molto meglio immagazzinare un hash che contenga dati associati, come ad esempio username + $_SERVER['HTTP_USER_AGENT'] che lo lega solo e soltanto a quella macchina ( l'IP non conviene usarlo perché non puoi sapere se l'utente è in una sottorete come me ora, o in shared, come tutti oramai ).
In pratica metti nella sessione due valori
PHP:
$_SESSION['username'] = $username
$_SESSION['auth'] = sha1($id . $_SERVER['HTTP_USER_AGENT']);
e ogni volta che vuoi verificare se chi è connesso è chi dice di essere, chiedi al database l'id dello username immagazzinato in $_SESSION['user'] e poi fai
PHP:
if ( sha1($id . $_SERVER['HTTP_USER_AGENT']) == $_SESSION['auth'] ) {
// continuo...
} else {
header('location: login.php');
}
Farraginoso? Sì ma che ci vuoi fare? Se vuoi star sicurto questo è solo l'entry level.
fonti e varie
http://php.net/manual/en/session.idpassing.php
https://en.wikipedia.org/wiki/Session_(computer_science)
http://php.net/manual/en/session.customhandler.php