Salve a tutti,
potreste dirmi se il procedimento che sto usando è giusto (o comunque se non sto facendo errori madornali) per favore?
Premetto di aver letto la pillola in rilievo e anche il manuale di php.net
Dunque il sito che ho è strutturato in questo modo:
codice:
pagina_semplice -> una pagina qualsiasi del sito in cui non è richiesto l'accesso con user/psw
pagina_di_login -> nel mio caso la pagina di login corrisponde anche a quella di logoff
pagina_login_check -> pagina di verifica dati
pagina_riservata1 -> pagina in cui devo verificare l'autenticazione
pagina_riservata2 -> come sopra...
Ho fatto un database così strutturato:
codice:
CREATE TABLE `users_online` (
`uso_id` int(10) NOT NULL auto_increment,
`uso_ip` varchar(15) NOT NULL default '',
`uso_timestamp` varchar(15) NOT NULL default '',
`uso_session_id` varchar(255) NOT NULL default '',
`uso_usr_id` int(10) default '0',
PRIMARY KEY (`uso_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
In tutte le pagine del sito c'è una classe che scrive in questo database se ci sono utenti che stanno visualizzando le pagine: nel caso in cui la pagina sia di tipo pagina_semplice la classe scrive solo l'ip e timestamp; nel caso in cui sia una pagina_riservata scrive anche il session_id e l'user_id.
Ed ecco essenzialmente come ho strutturato il codice:
pagina_di_login:
Codice PHP:
// sloggo
session_start();
if( $_SESSION['logged'] ) {
session_unset();
$_SESSION = array(); // Desetta tutte le variabili di sessione.
session_destroy(); // Infine distrugge la sessione.
}
$visitors_online = new usersOnline( $conn, DATABASENAME ); // scrivo nel db l'utente on line
pagina_login_check:
Codice PHP:
// verifico i dati
// [...]
// sessione
session_start();
session_register('logged'); $_SESSION['logged'] = $usr_id;
// scrivo l'utente online, stavolta inserendo anche gli altri 2 parametri
$visitors_online = new usersOnline( $conn, DATABASENAME, session_id(), $usr_id );
pagina_riservata:
Codice PHP:
// includo la verifica dell'autenticazione
// della sessione in tutti i files
require_once "includephp/sess.php";
// questo file sess.php contiene essenzialmente:
//----------------------------//
session_start();
if( !session_is_registered( 'logged' ) || session_id() =='' ) { header( 'Location: pagina_di_login.php', false ); exit; }
// tramite la classe verifico nel database l'userid precedentemente
// inserito tramite l'id di sessione
$usr_id = usersOnline::retreive_userid( session_id() );
// dopodicchè scrivo che l'utente è online
$visitors_online = new usersOnline( $conn, DATABASENAME, session_id(), $usr_id );
// infine recupero i suoi dati
$ris = &mysql_query( 'SELECT users.*, ( usr_id = '.intval( $usr_id ).' ) AND ( flag &1 );' ) or die( 'stop' );
if( mysql_num_rows( $ris ) != 1 ) {
session_unset();
session_destroy();
header( 'Location: pagina_di_login.php', false ); exit;
}
$row = mysql_fetch_row( $ris );
//----------------------------//
Tutto sembra funzionare discretamente:
esempio: eseguo il login -> pagina di controllo -> vengo reindirizzato nell'area riservata -> sloggo andando alla pagina di login -> scrivo manualmente nell'url la pagina riservata (senza reinserire i dati user/psw) -> vengo reindirizzato alla pagina di login.
Fin qui tutto ok... ma c'è qualcosa che non mi torna.
Quanto faccio gli unset e destroy sessione, le variabili di sessione vengono distrutte ma il session_id rimane lo stesso anche se uso session_regenerate_id(), sembra rimanere lo stesso...
...pensavo di basarmi su di esso per fare controlli più sicuri...
qualcuno saprebbe aiutarmi a capire dove sbaglio?