Newsgroup: it.comp.www.php
Titolo: Controllo sessione

Ciao a tutti,
mi è venuto un dubbio: come controllate i diritti nelle zone protette da 
password del vostro sito?
Per esempio mi verrebbero queste alternative, ma mi piacerebbe un vostro 
parere:
- al login memorizzo nelle variabili di sessione utente e password e in ogni 
pagina rifaccio la stessa query al database per controllare l'identità e i 
diritti
- al login memorizzo nel db (dove loggo le azioni) anche l'id di sessione, 
che poi controllo nelle altre pagine per essere sicuro che la sessione è 
veramente quella del login
Alternative "sicure"?
C'è differenza fra le 2 per prestazioni e pesantezza?
grazie :)
ciao 

 (la usi anche per altro tipo nome utente id ip)
scusa eh, ma in questo modo se non controllo neanche l'id di sessione, è un 
procedimento sicuro?
Non posso da utente malintenzionato crearmi una sessione fasulla con un 
piccolo script e bypassare il controllo? 

 password del vostro sito?
Una volta che hai effettuato il login in una pagina, la sessione è iniziata,
per cui basta utilizzare un variabile conosciuta per portarti dietro il
fatto che l'utente che vuole accedere ad una determinata pagina ha oppure
no i diritti per vederla.
Esempio.
Mettiamo che hai tre pagine: prova1.php, prova2.php, prova3.php e mettiamo
che in prova1.php hai un form di questo tipo:
<form method="post" action="prova2.php">
 <input type="text" name="account">
 <input type="text" name="password">
 <input type="submit">
</form>
Ora, una volta che l'utente ha riempito il campo account ed il campo
password, cliccando sul puntante submit avvia il collegamento alla pagina
prova2.php, che è protetta da account e password.
In prova2.php, quindi, avrai una cosa simile:
<?php
 session_start();
 // Se la variabile autenticato non è impostata a 1 ...
 // ... ovvero se questa e' la prima autenticazione
 if ($_SESSION['autenticato']!=1)
 {
  $account=$_POST['account'];
  $password=$_POST['password'];
  ..............
  ... confronto account e password con alcuni valori che conosco,
  ... magari presi da un db
  ..............
  ..............
  if (i_dati_non_sono_regolari)
  {
   // Rispedisco l'utente alla pagina di login
   header("Location: /prova.php");
   exit();
  }
 }
 $_SESSION['autenticato']=1;
?>
A parte il controllo se i dati inseriti per l'accesso a prova2.php sono
corretti o meno, la parte interessante è quella dal session_start() in poi.
Infatti si inizia una nuova sessione e si memorizza una variabile
$_SESSION['autenticato'] che mi dice se l'utente si è autenticato o meno.
Sapendo che il percorso che il navigatore dovrebbe seguire è prova1.php, poi
prova2.php ed infine prova3.php, in quest'ultimo file per testare
l'autenticazione basta scrivere all'inizio del file:
<?php
  session_start();
  // Se la variabile autenticato non è impostata a 1 ...
  // ... ovvero se questa e' la prima autenticazione
  if ($_SESSION['autenticato']!=1)
  {
  // Rispedisco l'utente alla pagina di login
  header("Location: /prova.php");
  exit();
   }
?>
Praticamente controlli semplicemente se la variabile autenticato è 1 o no.
Se è diversa da 1 è perchè l'utente non si è autenticato, e quindi non può
avere accesso a prova3.php e viene rispedito alla pagina di login,
prova.php.
Se un malintenzionato volesse entrare dentro la pagina prova3.php, per
esempio, non entrerebbe perchè la variabile 'autenticato' sarebbe diversa
da 1 (perchè non è stata mai impostata) e quindi non avrebbe accesso alla
pagina.
-- 
Ciao,
 Fabrizio
=== 
http://www.negusweb.it
 ===

 determinata pagina ha oppure no i diritti per vederla.
il metodo che tu dici l'ho già usato in diversi script, ma ieri m'è venuto 
per un attimo un dubbio :)
Se io utente malintenzionato conosco il sorgente di quei puoi tre page1 
page2 e page3, e mi creo un mio page4 che registra una sessione con 
variabile di sessione uguale alla tua, e poi col location carico il tuo 
page3?
siamo sicuri che non vada?
Perchè non dovrebbe andare?
tutto qui il mio dubbio :) 

 page2 e page3, e mi creo un mio page4 che registra una sessione con
Come fai a creare page4? In che modo creai page4? Hai accesso al server?


 un piccolo script e bypassare il controllo? 
E quale ID vorresti passargli? Se non e' un ID di una sessione valida
allora non troverai nessun valore salvato in sessione.
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

 server?
Diciamo di si.
In questo caso il tuo controllo viene saltato vero? 

 allora non troverai nessun valore salvato in sessione.
non ho capito..
Allora diciamo che io faccia 2 script: page 1 e page2
in page 1 faccio il login, controllo user e pass, e resitro 
$_SESSION['logged'] = 1 per esempio
in page2 controllo che $_SESSION['logged']sia = 1 giusto?
Ok adesso io utente malintenzionato mi creo un page3 dove semplicemente 
inserisco
session_Start();
$_SESSION['logged'] = 1
e poi linko il page2 di prima
dovrei essere loggato senza aver messo utente e password...
Questo credo avvenga senza problemi se posso creare files sul server, spero 
almeno non possa avvenire fra sito e sito...
Dove sbaglio?
Voi vi limitate a registrare una variabile di sessione e controllare quella? 

 $_SESSION['logged'] = 1
Scusa, ma a quale utente malintenzionato dai accesso al tuo spazio di
hosting?


 hosting?
a nessuno era solo una curiosità :)
Insomma controllare anche il session id oltre alla variabile di sessione 
darebbe sicuramente maggiore sicurezza, così come fare il controllo di 
utente e password in ogni pagina.
Per quanto riguarda le sessioni mi manca un po' di teoria:
- chiaramente nello stesso sito il sid rimane lo stesso
- fra sito e sito sullo stesso server riesco a mantenere la stessa sessione? 
(e questo sarebbe un bel problema usando il metodo della variabile singola 
di sessione sui server con + siti)
- fra server e server chiaramente il problema non si pone..

 sessione? 
Devi comunque conoscere il SID di un utente autenticato, cosa non
proprio immediata.


 proprio immediata.
No scusa, se io controllo solo un $_SESSION['nomevariabile'] è indifferente 
se è di una sessione o dell'altra..
Per questo ritengo sicuro verificare il sid (che però devo salvare da 
qualche parte per verificarlo) insieme alla variabile di sessione
Giusto o non giusto?
Se quando mi loggo salvo il sid E la variabile, e poi controllo il sid E la 
variabile sono sicuro dell'utente
Se controllo SOLO la variabile, del sid non mi interessa nulla quindi quella 
variabile è valida ovunque sia creata
Oppure come dici tu semplicemente non ho capito nulla :) mi spieghi? 

 sid E la variabile sono sicuro dell'utente
Esempio:
Apri la pagina, il tuo SID e' 123456
Ti logghi, il tuo SID e' 123456
Salvi $_SESSION['nomevariabile'] = pippo e $_SESSION['sid'] = 123456,
il tuo SID e' 123456
Riaccedi alla pagina, il tuo SID e' 123456
Verifichi che $_SESSION['sid'] sia uguale a cosa? Ovviamente al sid che
stai usando per accedere alla sessione, che ovviamente sara' l'ID della
sessione stessa.
E' inutile salvare l'ID di sessione in sessione, poiche' esso stesso e'
il discriminante per accedere a determinati dati di sessione rispetto
ad altri identificati da un altro ID.


 rispetto ad altri identificati da un altro ID.
bingo, quindi come dicevo controllo anche sul sid e non solo sulla variabile 
di sessione.. in effetti non ha senso salvarlo in un db, basta salvarlo 
nella sessione
Perfetto :)
Grazie setec 

 basta salvarlo nella sessione
No, non hai capito. E' inutile salvare il SID nella sessione, poiche'
e' il SID stesso che identifica la sessione a cui stai accedendo.
-- 
I am what I am, I do what I can


 e' il SID stesso che identifica la sessione a cui stai accedendo.
Mi stai facendo sentire un disadattato :)
Pagina 1: login vero, controllo utente e password, registro il 
$_SESSION['variabile'] = 1
Pagina 2: logina fasullo sullo stesso server,  registro il 
$_SESSION['variabile'] = 1
Pagina 3, controllo il login verificando la $_SESSION['variabile'] = 1 come 
faccio a essere sicuro di arrivare dalla pagina1 e non dalla pagina2?
Questo posto che le variabili di sessione si mantengano fra diversi siti 
sullo stesso server, cosa che non so...
ok? :) 

 pagina2? 
1. Il tuo utente malintenzionato DEVE avere un account sul tuo stesso
server, e gia' questo limita molto il campo di azione.
2. Il server deve essere un cosi' gran colabrodo da permettere a domini
diversi di condividere le sessioni, ed anche questo e' tutto dire.
3. L'attaccande DEVE conoscere cosa salvi in sessione per fare
l'autenticazione, ossia deve poter accedere al codice sorgente dei tuoi
script, a questo punto qualsiasi controllo tu faccia non sarebbe
sufficiente, infatti potrebbe anche lui salvare in sessione il SID e
festa finita.
In nessun caso il tuo controllo aggiunge sicurezza, di fatto e'
completamente inutile.
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E


 festa finita.
Non credo, se salvo il SID in un database l'utente malintenzionato non 
potrebbe salvarlo senza la mia password, insomma il controllo sul sid 
salvato su database o controllo di utente e password in ogni pagina 
leverebbe anche questi dubbi direi...
Ad ogni modo, mi interessa il discorso delle sessioni condivise


 non potrebbe salvarlo senza la mia password, 
[mi quoto]
deve poter accedere al codice sorgente dei tuoi script
[/mi quoto]
Che cosa ti fa credere che se puo' accedere al sorgente dei tuoi script
non sia in grado di trovare la tua password per accedere al DB?
-- 
I am what I am, I do what I can


 script non sia in grado di trovare la tua password per accedere al DB?
beh penso agli script open source.. 

 beh penso agli script open source.. 
[ti quoto]
come controllate i diritti nelle zone protette da password del vostro
sito?
[/ti quoto]
Mi sembra tu stia parlando di codice che stai scrivendo non
dell'utilizzo di script terze parti.


 dell'utilizzo di script terze parti.
Beh se un domani volessi rilasciarlo? :) 

 Beh se un domani volessi rilasciarlo? :) 
Utilizza un fiel di configurazione in cui definisci i nomi delle
variabili di sessione e tanti saluti.


 diversi di condividere le sessioni, ed anche questo e' tutto dire.
Caro Setec,
per fortuna passando da un sito ad un altro, che se forzi l'utilizzo dello
stesso SID, la sessione viene reimpostata. Ovviamente il test l'ho svolto
su siti presenti sullo stesso server.


 variabile singola di sessione sui server con + siti)
No, non riesci a mantenere la stessa sessione.
Ho fatto 2 prove:
1) Ho collegato sito1 e sito2 semplicemente con con un link ed un
session_start() all'inizio di ciascuna pagina: l'id di sessione è diverso;
2) Ho collegato sito1 e sito2 passando al link tramite url anche l'id di
sessione iniziata in sito1: sito2, al momento di riaprire la sessione, ha 
aperto una nuova sessione.
Per un attimo mi avevi fatto preoccupare, se una cosa del genere fossa
potuta succedere. :-)


 sullo stesso server, cosa che non so...
Come ti ho detto in un post di questo thread se provi a collegare le
sessioni tra due siti diversi, anche residenti sullo stesso server, vengono
assegnate due sessioni diverse (ringraziando Dio).
Per quanto riguarda la pagina3, si tratta di un semplice problema di
programmazione.
Se vuoi sapere se l'utente sta accedendo a pagina3 da pagina2 o da pagina1,
puoi utilizzare il referrer oppure imposti una variabile di sessione
$_SESSION['pagina_precedente'], che modifichi via via che l'utente naviga
il sito.


 In questo caso il tuo controllo viene saltato vero?
Ma il controllo ce lo sta avendo il programmatore (come è giusto che sia)
non il malintenzionato. Almeno se ho capito che le 4 pagine le realizza il
programmatore.


 potuta succedere. :-)
finalmente hai capito il mio dubbio qual'era :)
E grazie per le prove che la mia pigrizia mi ha impedito di fare, ma mi 
rimane un dubbio:
creando una nuova sessione come dici tu dovrebbe resettare anche le 
variabili di sessione giusto?
Quindi QUESTO di fatto impedirebbe di creare una variabile di sessione 
farlocca in un altro sito sullo stesso server per bypassare il controllo
insomma, se controllo la variabile $_SESSION['var'] sul sito 1 quando sono 
loggato, e mi creo una $_SESSION['var'] nel sito 2 linkando poi il sito 1 
questa variabile non esiste, GIUSTO?
Se mi dici di si mi dichiaro soddisfatto e la smetto di rompere :) 

 farlocca in un altro sito sullo stesso server per bypassare il controllo
Esattamente.
