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

Ciao a tutti.
Ho un problema. Sto cominciando a scrivere un'applicazione php+mysql 
accessibile via rete da un numero limitato di utenti.
In base all'utente connesso devo poter visualizzare determinate pagine, 
attivare o meno determinati links.
Come faccio a mantenere aperta una connessione navigando attraverso le 
pagine "personalizzate" del sito? come posso evitare che qualche 
malintenzionato premendo più volte il tasto "back" del broswer o 
attraverso lo storico acceda alla pagina riservata? qualcuno mi può dare 
un consiglio su come impostare il lavoro?
Grazie.
Angelo

 riservata? 
Definisci "malintenzionato". Se l'utente usa il tasto back non fa altro
che visualizzare pagine precedentemente visualizzate per cui accede a
pagine a cui precedentemente aveva avuto accesso.
-- 
I am what I am, I do what I can
Do. Or do not. There is not try.

 
Per "mantenere aperta una connessione" intendo una situazione del genere:
*) attraverso una home page mi loggo, accedendo in questo modo ad una 
area riservata;
*) da quest'area riservata passo, attraverso semplici link, ad altre 
pagine riservate (riservate all'utente loggato nel punto sopra).
Per il discorso malintenzionato non vorrei trovarmi nella seguente 
situazione:
*) pc con win 95, utilizzato da più persone, l'utente registrato va a 
farsi un giro e al suo ritorno trova un collega (non registrato) 
navigare nelle sue pagine riservate.
Ciao
ab

 navigare nelle sue pagine riservate.
Ogni utente deve spegnere il PC quando ha finito, o riavviarlo.
Potresti rischiare e dirgli di chiudere solo il browser, o piu`
semplicemente dirgli di premere il pulsantino "logout" sul tuo sito, ma
per esperienza personale se lo dimenticano sempre...
Bye.

 navigare nelle sue pagine riservate.
IMHO se un utente lascia un PC accessibile a chiunque una sessione HTTP
aperta su una area riservata deve solo prendersela con se stesso se
succede qualche cosa del genere. E' come se per andare in banca un
cliente lasciasse la propria auto davanti all'ingresso con le porte
spalancate ed il motore acceso.
-- 
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


 
Ti ringrazio per il consiglio sulle sessioni. Mi documenterň.
Per il discorso sulla sicurezza la tua risposta mi lascia perplesso...

 Per il discorso sulla sicurezza la tua risposta mi lascia perplesso...
Perche'? 
Se un utente lascia una sessione loggata, per qualsiasi controllo tu
possa fare non sarai mai in grado di discriminare un "malintenzionato"
che ha preso il posto dell'utente dall'utente stesso.
-- 
I am what I am, I do what I can


 attivare o meno determinati links.
Ti do' alcune idee, che dovrai sviluppare. Se sei all'inizio della
programmazione in ambiente WEB le dovrai maturare un po'.
1) Nella sessione metti un array associativo 'A' delle pagine abilitate.
L'array e' inizialmente vuoto.
Dopo il login mostri la pagina base menu.php. Questa pagina, in base ai
permessi dell'utente, visualizza un determinato sottoinsieme di ancore.
Le ancore le produci con una funzione che fa due cose: stampa il codice
HTML dell'ancore nel solito modo e aggiunge la pagina all'array delle
pagine abilitate. Ad esempio, menu.php potrebbe essere cosi':
function ancora($pagina, $testo)
{
    # Stampa l'ancora alla pagina $pagina:
    echo("<a href=$pagina>$testo</a>");
    # Ricorda in sessione che puoi accedere alla pagina $pagina:
    $A[$pagina] = TRUE;
}
...
if( e' abilitato per accedere a a.php )
    ancora("a.php", "Funzionalita' A");
if( e' abilitato per accedere a b.php )
    ancora("b.php", "Funzionalita' B");
...
In ogni pagina x.php metterai all'inizio un controllo se esiste l'elemento
$A[nomepagina]. Se esiste puoi proseguire, altrimenti no. Questo lo puoi
fare con un altra funzioncina simile a questa:
function controlla_permesso_accesso()
{
    # Ricava il nome di questa pagina:
    $pagina = $_SERVER[nonmiricordocosacivamessoqui];
    # Se non abilitato, lamentati con l'utente:
    if( ! isset( $A[$pagina] ){
        echo("<html><body>NON ABILITATO - ");
        echo("TORNA AL <a href=menu.php>MENU</a></body></html>");
        exit;
    }
}
Con questo meccanismo la decisione se abilitare o menu un utente a
una certa pagina la prendi nello stesso posto in cui devi decidere se
presentare l'ancora a detta pagina.
Difetto: questa soluzione non impedisce all'utente di richiamare le
pagine cui e' abilitato in un ordine arbitrario. Ad esempio, non puoi
imporre il percorso a.php --> b.php, perche' l'utente puo' richiamare
le pagine a.php e b.php come e quando vuole.
2) Logico perfezionamento del meccanismo di prima: la funzione
controlla_permesso_accesso(), dopo avere superato il test, azzera
l'array delle abilitazioni $A[]. In questo modo l'utente e' costretto
a seguire le pagine del sito solo ed esclusivamente cliccando sulle
ancore predisposte da te. In altri termini, puoi vincolare l'utente
solo sui percorsi leciti previsti dalla logica del programma. Questo
e' importante quando le pagine, per via del codice che contengono,
hanno degli effetti collaterali, ad esempio sul DB. Esempio: se
l'utente ha richiamato la pagina "cancella_dati_tua_agenda.php" che
cancella la sua agenda appuntamenti, poi non potra' saltare alla pagina
"visualizza_tuoi_appuntamenti.php" perche' non esiste piu' la sua agenda
(magari ci sara' un'ancora nel menu per creare una nuova agenda).
3) Nelle applicazioni appena piu' complesse, le pagine si passano fra
loro dei dati. Esempio: nella pagina dell'agenda metto un'ancora
alla pagina di un appuntamento di questo tipo:
    <a href="mostra_appuntamento.php?pk=12345">ore 10:15</a>
dove pk e' la chiave primaria del DB che contiene il dettaglio
dell'appuntamento.  La pagina mostra_appuntamento.php usa la
pk per recuperare dal DB il dato.  L'utente malizioso capira'
subito che se scrive sulla barra degli indirizzi una cosa come
"www.xxxxx.xxx/mostra_appuntamento.php?pk=9876" potra' visualizzare un
appuntamento arbitrario, magari inesistente, magari appartenente ad un
altro utente.
Insomma, sarebbe bene evitare di passare al client informazioni che
dovrebbero rimanere sul server, perche' poi e' difficile per il server
verificarle.
La soluzione e' una ulteriore evoluzione dell'array delle abilitazioni
del punto 2 precedente, che questa volta deve associare l'ancora cliccata
alla pagina e ai parametri voluti. L'implementazione piu' banale e'
usare un array nella sessione; ogni elemento dell'array contiene il nome
della pagina e i parametri voluti; l'indice dell'array viene riportato
nell'ancora. Esempio:
    <a href="mostra_appuntamento.php?i=34>ore 10:15</a>
e' la 34-esima ancora della pagina, alla quale corrisponde nella sessione
    $A[34] = array("mostra_appuntamento.php", "pk=12345")
In questo modo l'utente non puo' richiamare pagine arbitrarie, ma solo
quelle per le quali hai riportato l'ancora. Inoltre, l'utente non puo'
indicare parametri arbitrari, dato che questi parametri non vengono ne'
inviati al client, ne' accettati da questo; l'unico parametro accettato
dal client e' l'indice "i" della entrata nell'array $A[], dato la cui
validita' si puo' verificare molto facilmente e con certezza. La generica
pagina x.php dovra' pertanto fare quanto segue:
- recuperare l'indice "i"
- recuperare l'elemento $A[$i]
- verificare se la pagina indicata in $A[$i] corrisponde proprio a "x.php"
- recuperare i parametri da $A[$i]
- azzerare l'array $A[]
- fare quello che deve fare, usando i parametri ottenuti
L'estensione dei meccanismi di prima al caso dei bottoni e dei form e'
abbastanza immediata.
Ciao,
 ___ 
/_|_\  Umberto Salsi
\/_\/  
www.icosaedro.it

 dell'array viene riportato nell'ancora. 
Implementazione sconsigliata. In un sistema con molti utenti e/o molti
dati accessibili si finirebbe per generare migliaia di query od
archiviare migliaia di informazioni nelle sessioni che non
necessariamente verranno utilizzate.


 
Ti ringrazio per la mail. Adesso me la leggo con calma. Effettivamente 
sono all'inizio, nel senso che smanetto da anni (ho cominciato quando 
frequentavo ing) ma conosco le cose solo ad un livello "medio".
Il discorso php+mysql è nato dall'esigenza di condividere con alcuni 
amici alcuni database, senza sbattimenti informatici (per loro).
E quindi adesso mi sto informando un po'...
Grazie.
Angelo