cookies per tenere attiva una sessione

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
salve gente! :)

ho un'area privata con iscritti gestita a sessioni e non riesco a capire cosa sbaglio con i maledetti biscottini :D

una sessione termina dopo un tot di tempo (determinato dal server, giusto?), oppure quando il browser viene chiuso, giusto?
comunque a me interessa il secondo caso

vorrei mettere una casella come nei forum, che se spunti "Mantieni il login" quando si riapre il browser si è ancora loggati
magari non per sempre, ma per un periodo di tempo determinato, e comunque è previsto il logout manuale che distrugge tutto

studiando ho letto che è possibile farlo mandando all'utente un cookie, ma non riesco proprio a farlo funzionare
o forse a capire cosa sbaglio :crying:

il form si presenta così
PHP:
<form action="auth.php" method="post">
<input type="text" name="id" />
<input type="password" name="password" />
<input type="checkbox" name="ricordami" value="1" />
<input type="submit" value="login" />
</form>
e quindi nel file auth.php ho provato a mettere questo
PHP:
if (isset($_POST['ricordami'])) {  
setcookie("keeplog", "1", time()+259200);
}
e così dovrebbe rimanere valido per tre giorni, invece no
il valore di $_POST['id'] è poi quello che viene registrato nella variabile di sessione
e l'if l'ho messo all'inizio, prima di ogni altra cosa

c'è qualche anima pia che mi spiega con parole molto semplici cosa non va nel mio biscottino?
o magari se mi date qualche link ad un buon script già fatto che contempli anche il login automatico in modo da studiarmelo,
che finora cercando in giro ho trovato tutte cose che non corrispondono esattamente a quello che voglio io :(

già altre volte ho visto la luce in questo forum, quindi spero anche stavolta nel vostro aiuto :)
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
grazie della risposta :confused: non saprei come possa aiutarmi
è la stessa spiegazione generica che ho già trovato anche sul sito ufficiale, e comunque di articoli simili ne ho letti molti anche in italiano

forse le mie varie domande non erano abbastanza chiare
una sessione termina dopo un tot di tempo (determinato dal server, giusto?), oppure quando il browser viene chiuso, giusto?
[cut]
c'è qualche anima pia che mi spiega con parole molto semplici cosa non va nel mio biscottino?
o magari se mi date qualche link ad un buon script già fatto che contempli anche il login automatico in modo da studiarmelo
non mi serve la teoria, ma qualcuno che mi dica cosa ho messo di sbagliato nel mio cookie
oppure qualche esempio pratico da poter confrontare con il codice del mio script
perché il cookie lo scrive, e con i valori che gli ho dato io, però non tiene aperta la sessione e non capisco il motivo :(
 

Eliox

Utente Attivo
25 Feb 2005
4.390
3
0
l'articolo che ho postato presenta il codice, quindi è pratico oltre che teorico. Io per esempio per far persistere un cookie 7 giorni utilizzo il seguente codice:

PHP:
setcookie("nome","valore",time()+60*60*24*7);
provalo e vedi se alla riapertura del browser esiste ancora (a meno che il tuo browser non sia impostato per cancellare i cookies in uscita, cosa che capita molto spesso senza che lo si sappia).

Naturalemente, il controllo:

PHP:
if (isset($_POST['ricordami'])) {  
setcookie("keeplog", "1", time()+259200);
}
NON deve essere fato se il cookie è già esistente
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
scusa, forse è una domanda stupida, ma non capisco proprio cosa ci sia di diverso tra
PHP:
setcookie("nome","valore",time()+60*60*24*7);
e
PHP:
setcookie("keeplog", "1", time()+259200);
keeplog è il nome del cookie, 1 il suo valore e 259200 la stessa cosa di 60*60*24*3 ma espressa in secondi
quindi? :confused: cosa ho fatto di diverso da quell'esempio? come ho detto prima il cookie viene creato proprio con quei valori
comunque per scrupolo l'ho rifatto così e come immaginavo non funziona ugualmente :(
quello che mi serve come "pratica" è uno script oppure un articolo che mi faccia vedere un esempio
in cui ci sia l'interazione tra il codice delle sessioni e quello dei cookies

ti assicuro che il mio browser non cancella i cookies, altrimenti tutti i forum e siti a cui sono iscritta soffrirebbero dello stesso problema :p

e tra l'altro vado sempre a cancellare quel singolo cookie lì a mano
prima di provare a cambiare il codice nello script quindi è come se non ci fosse mai
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
nessuno? :crying: io sto comunque continuando a guardare in giro, anche in inglese, ma trovo solo script che
o si basano totalmente sui cookies per memorizzare i dati del login anche poi vengono archiviati nel database,
oppure tutti quelli che utilizzano le sessioni non prevedono un checkbox per ricordare il login di accesso
a me servirebbe sapere come impostare il setcookie per mantenere l'ID di sessione alla chiusura del browser

non so più cosa o dove cercare e ho esaurito le keyword di ricerca :(
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
casomai è
PHP:
session_start()
e c'è :rolleyes:
ma grazie lo stesso del tentativo ^^
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
di solito anche io faccio così, o meglio, mi studio il codice per capire e poi lo adatto alle mie esigenze, e se avessi trovato qualcosa che fa al caso mio non avrei chiesto aiuto qui, non credi? :D
trovo solo script che o si basano totalmente sui cookies per memorizzare i dati del login anche poi vengono archiviati nel database, oppure tutti quelli che utilizzano le sessioni non prevedono un checkbox per ricordare il login di accesso
il problema è che finora ho trovato solo esempi del tipo di cui sopra

e studiandomi la guida ufficiale sono riuscita, come ho detto, a far creare il cookie, ma non a tenermi la sessione aperta, per questo sto chiedendo un aiuto concreto con esempio pratico per capire dove è che sbaglio

grazie lo stesso per l'interessamento :byebye:
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
23
Roma
alessandro1997.netsons.org
Guarda, te lo spiego io in modo teorico. Ho utilizzato questo sistema con tutti i sistemi di autenticazione che ho creato in PHP e non mi ha mai dato problemi di sorta.

Login
Oltre a impostare la sessione contenente l'ID utente, imposta anche un cookie che contiene l'ID di sessione (recuperato con la funzione session_id()) e salva in una tabella questi dati: ID utente, ID di sessione e data di scadenza (in secondi). Ovviamente alla data di scadenza dovrai aggiungere il time, sia a quella del cookie che a quella del database, esempio:
PHP:
<?php
// imposta un cookie che durerà una settimana
$expires = 60 * 60 * 24 * 7;
$expires += time();
setcookie('nome', 'valore', $expires);
?>
Inizializzazione di una pagina
All'apertura di ogni pagina, subito dopo la connessione al database, dovrai eseguire una query che cancelli dalla tabella delle sessioni (appositamente creata) tutti i dati la cui date di scadenza sia minore di time. Per esempio:
PHP:
<?php
// CONNESSIONE
$query = mysql_query("DELETE FROM sessions WHERE expires < {$time}");
// RESTO DELLO SCRIPT
?>
Dopo aver fatto questo, controlli l'esistenza del cookie che dovrebbe contenere l'ID di sessione. Se esiste recuperi i dati dalla tabella delle sessioni utilizzando come criterio di ricerca l'ID salvato nel cookie, e quindi imposti una nuova sessione all'utente.

Logout
Vabbè, qui c'è poco da spiegare. Cancelli cookie, sessione e dati dal database.

So che non sono stato molto chiaro, ma non sapevo come spiegartelo meglio. Se hai problemi dimmi!
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
So che non sono stato molto chiaro, ma non sapevo come spiegartelo meglio. Se hai problemi dimmi!
No, assolutamente, sei stato chiaro, ti ringrazio anche se mi stupisce che per ottenere questo risultato sia necessario creare addirittura una tabella nel database. Credevo che bastasse creare un cookie permanente e alla riapertura del browser verificare se è presente. :confused:
E mi hai fatto sorgere un nuovo dubbio: ho letto nel manuale di PHP che session_start() crea automaticamente il cookie che contiene l'id di sessione, e che se non specificato altrimenti con session_name() di solito si chiama PHPSESSID. E' giusto? In questo caso sarebbe superfluo recuperarlo con session_id() ma basterebbe $_COOKIE['PHPSESSID'] E' corretto?

Abbiate pazienza se faccio delle domande stupide :eek: ma mi sono adentrata nel mondo del PHP da non molto e cerco di studiare quello che posso nel poco tempo che ho. Per questo chiedevo nello specifico uno script già fatto da poter vedere come funziona, riesco a capire più facilmente se alla spiegazione teorica è associato un esempio di codice da poter confrontare con quello che uso io e poi modificarlo di conseguenza per le mie esigenze. Io ho un file sessione.php che inizializza la sessione e le variabili, e viene incluso in ogni pagina, mentre i dati inviati con il form di login sono gestiti dalla pagina auth.php che li verifica e setta poi i permessi relativi.

Ti ringrazio ancora alessandro, attendo una tua risposta, o di chiunque altro sia così gentile da darmi anche un suo suggerimento utile. :)

:byebye:
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
intanto, secondo me, non c'è differentre tra +259200 e +3*24*60*60

poi prova così, se il cookie esiste non lo crea e setta di nuovo


if (isset($_POST['ricordami'])) {
if (!isset($_COOKIE['keeplog'])){
setcookie("keeplog", "1", time()+259200);
}
}
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
23
Roma
alessandro1997.netsons.org
No, in realtà sarebbe meglio utilizzare session_id per recuperare l'ID di sessione. Se hai una funzione che fa il lavoro sporco al posto tuo perché insistere? :D

Comunque il metodo che si basa sulla creazione di un cookie chiamato keeplog e che contiene solamente il valore 1 non riesco a capire come possa funzionare.

Insomma: come fa lo script a capire con quale ID l'utente deve essere loggato? Supponiamo che tu abbia gli utenti mario e pippo. Il secondo si logga, la sessione viene creata insieme al cookie keeplog, quindi esce e la sessione viene distrutta automaticamente.

Al successivo accesso lo script in effetti capisce che l'utente è stato connesso e che il suo login dovrebbe essere memorizzato. Ma come fa a capire se questo utente è mario o pippo?

In realtà ci sarebbe anche un altro sistema, ma la cosa diventa più complicata. Il sistema che ti ho illustrato è quello che usano, grosso modo, tutti i software che prevedono registrazione/memorizzazione del login. Ovviamente poi ogni CMS ne sviluppa una sua versione che corregge alcuni bug di sicurezza (protezione da Cookie Grabber, etc.) ma nel tuo caso dovrebbe andare più che bene quello che ho scritto.

Per altri dubbi dimmi pure!
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
hai ragione alessandro :D quell'1 non aveva proprio senso da solo, ma avendo fatto varie prove anche con altre variabili,
e sempre senza riuscire a mantenere aperta la sessione, ho poi dato erroneamente per scontato che non fosse rilevante

sicuramente il metodo a tabella suggerito da te è anche più affidabile dal lato sicurezza, rispetto a salvare i dati di login nei cookie
allora seguendo le tue indicazioni teoriche ho cominciato a mettere giù un po' di codice nel mio script
potresti darci un'occhiata e consigliarmi, perché alcuni passaggi non sono sicura di averli capiti bene :)

questa è la tabella che ho creato nel database
PHP:
mysql_query("CREATE TABLE `sessioni` (
 `sid` varchar(40) NOT NULL,
 `uid` varchar(30) NOT NULL,
 `expires` varchar(10) NOT NULL,
 PRIMARY KEY (`sid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1", $conn) or die("Impossibile creare la tabella sessioni!");
sid è il campo dove salvo l'id di sessione e uid l'id utente

nel file connessione.php che viene incluso in ogni pagina ho inserito questa riga,
ma non ho capito se devo anche inizializzare quella variabile $time e casomai dove
PHP:
$delete=mysql_query("DELETE FROM sessioni WHERE expires < {$time}");
nel file auth.php che è quello che serve per l'autenticazione degli utenti ho messo
PHP:
if (isset($_POST['login'])) {
$expires=time()+2592000;
$sid=session_id();
setcookie("keeplog", "$sid", $expires);
mysql_query("INSERT INTO sessioni(sid, uid, expires) VALUES('$sid','$id','$expires');", $conn);
}

if (isset($_COOKIE['keeplog'])) {
mysql_query("SELECT * FROM sessioni WHERE sid='$sid'", $conn);
session_start();
}
ovviamente il valore $id è stato registrato nella variabile di sessione presente sempre nel file auth.php
PHP:
$_SESSION["id"]=$id;
nel secondo if ho messo semplicemente session_start() perché non ben ho capito cosa intendevi con
alessandro1997 ha scritto:
quindi imposti una nuova sessione all'utente
anche se non credo che serva granché messo lì perché ho un file sessione.php incluso in ogni pagina

e già che ci sono posto di nuovo il login.php così vedi tutto il codice senza dover girare per il thread
PHP:
<form action="auth.php" method="post"> 
<input type="text" name="id" /> 
<input type="password" name="password" /> 
<input type="checkbox" name="login" value="1" /> 
<input type="submit" value="login" /> 
</form>
ed infine nel logout.php ho aggiunto questa riga
PHP:
TRUNCATE TABLE `sessioni`
per ora è tutto, mi auguro di non aver scritto troppe boiate :D e grazie ancora per l'aiuto :byebye:
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
il codice che ho scritto ha un senso? :(
alessandro non mi abbandonare! :crying:
 
Ultima modifica:

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
23
Roma
alessandro1997.netsons.org
Ciao, non ti abbandono, tranquilla. È che ultimamente ho poco tempo e quando mi sono registrato a questo forum non pensavo che me ne avrebbe portato via così tanto! Allora, ti ho fatto i tre file così puoi studiarteli con calma, ok?

Cominciamo dal primo, che è l'azione per il Login. Se tutti i controlli sono andati a buon fine (l'utente esiste, la password è corretta...) dovrai inserire questo codice:
PHP:
<?php
$sid = session_id();
$expires = time() + 2592000;

setcookie('keeplog', $sid, $expires);
$_SESSION['keeplog'] = $id;

mysql_query("INSERT INTO sessioni VALUES ('{$sid}','{$id}','{$expires}')");
?>
Il codice per il logout, invece, sarà questo:
PHP:
<?php
$sid = session_id();
$id = $_SESSION['keeplog'];

mysql_query("DELETE FROM sessioni WHERE uid='{$id}' AND sid='{$sid}'");
unset($_SESSION['keeplog']);
setcookie('keeplog');
?>
Questo qui è invece il codice che dovrai includere prima di ogni altra cosa nei tuoi script. Si occupa della cancellazione delle sessioni esistenti, del ripristino delle sessioni salvate e della connessione al database:
PHP:
<?php
$conn = mysql_connect('localhost', 'root') or die('Errore durante la connessione: '. mysql_error());
mysql_select_db('utenti', $conn) or die('Errore durante la selezione del database: '. mysql_error());

$time = time();
mysql_query("DELETE FROM sessioni WHERE expires < {$time}");

$query = mysql_query("SELECT * FROM sessioni WHERE sid='{$_COOKIE['keeplog']}'");
$assoc = mysql_fetch_assoc($query);

if($assoc['uid'] > 0)
	$_SESSION['keeplog'] = $assoc['uid'];
?>
Ovviamente dovrai modificare i dati del database con quelli del tuo server. Non l'ho testato, ma non dovrebbe dare problemi ;)
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
ciao alessandro :)
intanto mi scuso perché non vorrei esserti sembrata insistente :eek:
poi ti ringrazio immensamente per codice, non ho ancora avuto il tempo materiale di provarlo col mio script ma studiandomelo un po' credo di aver capito quasi tutto :fonzie: dico quasi perché appunto mi sono accorta di una cosa che ho omesso di specificare ma che ho idea che se non la aggiungo la sessione non venga ripristinata in modo corretto

quando viene autenticato il login, è previsto anche che venga riconosciuto se è un utente oppure l'admin, e ciò viene fatto con un'altra variabile di sessione registrata così $permesso=$_SESSION["permesso"] che poi è settata a $_SESSION["permesso"]="1" per gli utenti e $_SESSION["permesso"]="2" per l'admin
se l'utente che vuole accedere alle pagine riservate non è loggato o non è admin il valore della variabile è impostato a zero, quindi per mantenere la sessione dovrei anche salvare il valore del permesso giusto?
quindi pensavo che forse dovrei creare un ulteriore campo nella tabella e salvarlo lì insieme a id sessione, id utente e scadenza e a questo punto quando lo script fa il restore della sessione precedente si porta dietro anche l'autorizzazione di tipo utente oppure admin giusto?
una cosa tipo
PHP:
`auth` tinyint(1) NOT NULL,
prima di cimentarmi nelle prove vere e proprie mi farebbe piacere avere una tua conferma delle mie supposizioni, o anche un'indicazione di un metodo alternativo per mantenere sia l'id di sessione dell'utente che appunto il permesso

e già che ci sono ho una domanda specifica sui campi della tabella che dovrei creare per le sessioni
PHP:
`expires` varchar(10) NOT NULL,
va bene per il campo data espresso in secondi, oppure è meglio un campo di tipo INT(10)
so che potrà sembrare una domanda scema, ma non voglio "sprecare" spazio nel database
e ho calcolato che time()+2592000 crea all'incirca un valore di 10 cifre

grazie anticipate a chiunque risponderà ai miei dubbi da niubba :book:
:byebye:
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
23
Roma
alessandro1997.netsons.org
Riguardo al tuo primo dubbio non credo che ci sia bisogno di portarsi dietro il valore in una sessione. Non puoi, tramite l'ID salvato già nell'altra sessione, recuperare i dati dalla tabella utente e controllare se l'utente ha i permessi appropriati? Certo, per risparmiare query potresti sempre salvare il valore in una sessione, nessuno te lo vieta ;)

Sulla tua seconda domanda non so che risponderti: non lo so. Io ho sempre usato un campo INT da 11 caratteri di lunghezza (sono pessimista :D), non sono sicuro perché non mi sono mai studiato più di quello che mi serviva i database, ma non mi sembra che il campo DATE avesse lo stesso valore.

Se proprio vuoi essere precisa puoi chiedere nella sezione Database, lì sicuramente sapranno risponderti con più precisione di me ;)

Comunque non sei affatto insistente, anzi. Mi ricordi me quando ero agli inizi :D
E poi, se ti rispondo è perché ho scelto di farlo, quindi non ti scusare ad ogni post :)