cookies per tenere attiva una sessione

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
Ringraziarti per il tempo che mi dedichi è il minimo, Alessandro :)

Beh no, non è un problema di query, piu che altro di spazio a disposizione che non vorrei sprecare,
comunque dovrei aver trovato i campi adatti per ogni valore, quindi ora la mia tabella è così composta
PHP:
 `sid` char(32) NOT NULL,
 `uid` varchar(30) NOT NULL,
 `expires` int(11) UNSIGNED NOT NULL,
 PRIMARY KEY (`sid`)
però alla fine tu hai parlato di DATE :confused: ma in expires non dovrei salvare il tempo in secondi?
se uso un campo di tipo data avrò invece una cosa tipo YYYY-MM-DD :confused: e non mi torna

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?
Eh, mi pareva di aver detto una boiata :D in effetti io questo controllo l'ho già fatto,
ed ho anche registrato la relativa variabile di sessione che setta il permesso all'utente

Ma ci deve essere qualcosa che non ho ancora afferrato molto bene, perché non funziona :dipser:

Per evitare di perdermi di nuovo dei pezzi per strada o dimenticarmi qualcosa di rilevante,
questo è il codice delfile auth.php che viene chiamato dal login.php che contiene il form
PHP:
<?php
include "Include/sessione.php";

$data=strftime("%Y-%m-%d", time());
$id=$_POST['id'];
$pass=md5($_POST['password']);
$_SESSION["controllo"]="si";
$_SESSION["id"]=$id;
header("Cache-control: private");

//utente
$controllo=mysql_query("SELECT COUNT(*) FROM utenti WHERE nick='$id' AND psw='$pass' AND stato='0'", $conn);
while ($riga=mysql_fetch_array($controllo)) {
$a="$riga[0]";
}
if ($a=="1") {
$_SESSION["permesso"]="1";
mysql_query("UPDATE utenti SET logged='$data' WHERE nick='$id'", $conn);
header("Location: account.php");
die();
}
//admin
if ($id==$admin && $pass==md5($pass_admin)) {
$_SESSION["permesso"]="2";
header("Location: admin.php");
}
//errore accesso
else header("Location: login.php?error");
?>
e questo è codice del file relativo all'include sessione.php
PHP:
<?php
include "connessione.php";

session_start();
if ((isset($_SESSION["controllo"])) && ($_SESSION["controllo"]=="si")) {
$id=$_SESSION["id"];
$permesso=$_SESSION["permesso"];
} else {
$permesso=0;
}
?>
naturalmente dentro connessione.php ci sono tutti i dati per la connessione al server
e la selezione del database: le classiche variabili per hostname, dbname, dbuser, dbpass
ma sono settate anche le variabili che servono per l'accesso dell'admin che non viene salvato sul db
come gli utenti, e quindi $admin e $pass_admin vengono prese da lì e sono valori fissi

spero di essermi spiegata e che sia più chiaro di come funziona la parte di script per l'autenticazione

ho qualche difficoltà a capire dove dovrei integrare il codice che mi hai scritto tu :eek:
ho comunque fatto un po' di prove e modifiche da sola ma non ne sono venuta a capo :(

un grazie di cuore in anticipo a chi mi vorrà aiutare a capirci un pochino di più :byebye:
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
volevo dire una cosa che ho osservato nello script relativamente alla funzione header().
se non ho capito male dal manuale php
http://www.php.net/manual/en/function.header.php
la funzione header deve venire prima di ogni uot html e

Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include(), or require(), functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
ciao borgoitalia, grazie della risposta
è vero, ma prima dell'header non c'è nessun input di tipo HTML :)
nei files sessione.php e connessione.php ci sono soltanto variabili e query di tipo PHP e nessuno spazio o riga vuoti
il file con la dichiarazione del doctype non è incluso nel file auth.php e il redirect viene effettuato senza problemi

all'uso posso anche toglierlo e riaggiungerlo alla fine quando funzionerà la modifica
ma prima vorrei capire come fare a salvare la sessione e poi ripristinarla dal database
:byebye:
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
scusa ma, non ho ben capito cosa c'entra, sinceramente, perché il mio script funziona perfettamente
anche con l'header messo lì dov'è: mi loggo e mi reindirizza al pannello admin; che problema dovrebbe creare? :confused:

Silen ha scritto:
all'uso posso anche toglierlo e riaggiungerlo alla fine quando funzionerà la modifica
ma prima vorrei capire come fare a salvare la sessione e poi ripristinarla dal database
ho detto che posso benissimo toglierlo per fare le prove di ripristino della sessione dal database,
non mi cambia la vita, vorrà dire che dopo aver fatto il login nel pannello admin ci andrò a mano
ma il mio problema adesso è che non ho ben capito come fare, e avrei bisogno di aiuto nelle modifiche allo script :)
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
23
Roma
alessandro1997.netsons.org
Non capisco che cosa c'entra l'intervento di borgo italia, in effetti nessun input HTML inviato prima della funzione header, almeno da quello che posso leggere io. Altrimenti avresti avuto un errore PHP, e ora, sinceramente, non mi ricordo se era un E_WARNING oppure E_ERROR.

Comunque mi sembra che tu abbia fatto un po' di danni mischiando il mio script con un altro, inizio anche io a capirci poco. Ma non funziona in che senso? Qual'è il problema? Non effettua il login?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
"quando qualcosa può andare storto, ci va (I° legge di murphy)" quindi in tal caso conviene cancellare tutto e ripartire da zero.

dato che l'istruzione che avevi scritto secondo me è sintatticamente corretta io la scriverei in questa maniera
PHP:
if (isset($_POST['ricordami']) && !isset($_COOKIE['keeplog'])) {
//setto il cookie solo se non esiste
//nell'if entro solamente se il cookie non esiste e ho dato la conferma ricordami
setcookie("keeplog",$_POST['password'] , time()+259200); 
}

nella pagina del form farei queste modifiche

PHP:
<form action="auth.php" method="post"> 
<input type="text" name="id" />
<!-- se il cookie è vuoto il campo rimane vuoto altrimenti si formano i classici *********** -->
<input type="password" name="password" value="<?php echo $_COOKIE['keeplog'];?>/> 
<?php
//se il cookie esiste non faccio la domanda
if(!isset($_COOKIE['keeplog'])){
?>
<input type="checkbox" name="ricordami" value="1" /> 
<?php
}
</form>

può darsi che stia dicendo delle ca...te, ma tentar non nuoce
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
@borgoitalia
grazie del suggerimento e dell'interessamento, ogni piccolo aiuto da parte mia è più che gradito :)
il controllo dell'esistenza del cookie io l'ho messo direttamente nel file sessione.php,
quindi viene effettuato in qualsiasi pagina io abbia incluso quel file, perciò anche in login.php

ma vorrei proprio evitare di memorizzare la password dell'utente in un cookie,
per questo mi sto sbattendo con il metodo di salvare e ripristinare le sessioni dal database come proposto da alessandro.
E comunque dovrei comunque salvare due o tre cookies, solo la password non basta,
dovrei memorizzare ID utente, password e permesso, altrimenti non posso entrare nelle aree riservate agli utenti o all'admin

ciao alessandro :)
no, non ho mischiato nulla
nell'ultimo mio post ho soltanto messo il codice del mio script senza alcuna modifica per mostrare il suo funzionamento
è in esso che vorrei integrare appunto l'opzione di mantenere il login per un mese,
non ho necessità di riscrivere da zero il modulo di login o di gestione degli utenti nel database

come puoi vedere nel file auth.php autentico e imposto il permesso,
nel file sessione.php registro le variabili di sessione
e nel file connessione.php ci sono tutti i dati che servono per collegarsi al database

quello che non riesco a fare e che quindi non funziona è semplicemente il ripristino della vecchia sessione dal database
forse perché non ho capito come aggiungere quella parte di codice al file sessione.php
o forse dovrei creare un file a parte e poi includerlo?
però quest'opzione mi sembra assurda perché comunque tu mi hai detto che la parte in cui cancello le sessioni dal db e faccio il restore
deve essere inclusa in ogni pagina dell'area riservata, ed io in tutte quelle pagine includo appunto il file sessione.php, perciò, a logica, perché includerne un'altro? tanto vale includerlo in quello, no?

so che sembrano domande alla marzullo, ma io devo capirle le cose :D

e grazie e tutti e due dell'aiuto :book:
 
Ultima modifica:

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
23
Roma
alessandro1997.netsons.org
No, il metodo che usi è corretto. Hai controllato se il valore viene salvato nel database e se corrisponde all'ID utente che hai inserito e all'ID di sessione nel cookie keeplog? Quanto è lungo il campo sid nel database? Impostalo a 90, a me una volta non funzionava perché troncava l'ID di sessione, e ci ho messo due settimane per capirlo! :D
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.042
146
63
PR
www.borgo-italia.it
ciao
PHP:
A che cosa serve controllare nella pagina del login se l'utente è loggato? È ovvio che non sarà loggato
credo che tu non abbia capito
quando l'utente si è loggiato (e ha detto ricordami password) naviga e poi esce.
quando dopo un certo periodo rritorna sul sito e sulla pag di log la password (se il cookie non è scaduto) è gia impostata e non deve riscriverla e se la password (il cookie esiste) è gia impostata non gli viene fatta di nuovo la domanda "ricordami"

per silen
anche google imposta le password nei cookie
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
23
Roma
alessandro1997.netsons.org
Ma quando l'utente ritorna sul sito e il cookie d'identificazione non è scaduto viene direttamente loggato, senza passare dalla pagina di login :p

Comunque Google salva le password crittate. E in ogni caso non è una soluzione particolarmente sicura. Però non lo è neanche salvare l'ID di sessione in un cookie, basta un Cookie Grabber e addio sicurezza :D
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
quando dopo un certo periodo rritorna sul sito e sulla pag di log la password (se il cookie non è scaduto) è gia impostata e non deve riscriverla e se la password (il cookie esiste) è gia impostata non gli viene fatta di nuovo la domanda "ricordami"
certo, ma l'utente mica torna per forza nella pagina login, credo che abbia molto più senso mettere questo tipo di controllo
in ogni pagina dell'area riservata, non solo in quella del login, quindi tanto vale fare un include,
sia che sia un cookie che contiene id di sessione, sia che sia un cookie che contiene username e password

non è che io abbia delle esigenze cosi ristrette per la sicurezza, però,
se facciamo una sorta di "classifica", il metodo meno sicuro sicuramente è salvare id utente password in un cookie
un gradino più su credo che ci sia salvare l'id di sessione, perché non è un dato sensibile come la password

ad ogni modo secondo me in entrambi i casi basta comunque un cookie grabber,
e visto che in altri siti usano il metodo di alessandro e funziona, voglio provare pure io :D sono testa di legno

altrimenti mi rassegnerò e creerò un cookie che contiene id utente criptato e permesso utente
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
No, il metodo che usi è corretto. Hai controllato se il valore viene salvato nel database e se corrisponde all'ID utente che hai inserito e all'ID di sessione nel cookie keeplog? Quanto è lungo il campo sid nel database? Impostalo a 90, a me una volta non funzionava perché troncava l'ID di sessione, e ci ho messo due settimane per capirlo! :D

dunque, ho controllato, e nel database viene salvato un record ogni volta correttamente
che contiene id sessione (non tranciato) il nome dell'utente oppure il mio se mi loggo come admin
ed il cookie viene creato con il nome giusto e id sessione come valore
la scadenza anche è ok in entrambi

il problema è che le sessioni scadute non si cancellano e l'ultima, quella valida, non viene ripristinata,
e non capisco come integrare il codice nel file sessione.php
:confused:
in pratica riesco a far creare il cookie con i parametri che gli dico io,
ma alla riapertura del browser non ho il permesso come admin o come utente registrato ma solo come utente non registrato
ma probabilmente è dovuto anche al fatto che non capisco questa parte di codice come funziona
PHP:
$assoc = mysql_fetch_assoc($query); 

if($assoc['uid'] > 0) 
    $_SESSION['keeplog'] = $assoc['uid'];
:confused:
 
Ultima modifica:

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
ebbene, picchiandomi un po' sono quasi riuscita a far funzionare quasi tutto :hammer:

nel senso che ora sì, mi recupera l'id di sessione dalla tabella del database,
ma come immaginavo, perché l'accesso alle pagine riservate venisse mantenuto
oltre a id di sessione e id utente bisogna necessariamente aggiungere nella tabella sessioni
il campo che conservi il valore $permesso settato durante l'autenticazione dell'utente o admin


quindi l'unica cosa che adesso non va è la cancellazione delle sessioni scadute dalla tabella,
ovvero questa riga, inserita subito dopo session_start();
nel file sessione.php che viene caricato in ogni pagina dell'area riservata
PHP:
$time=time();
$delete=mysql_query("DELETE FROM sessioni WHERE expires < '$time'", $conn);
non cancella nulla dal database

così come questa riga che sono andata a creare nel file logout.php
PHP:
if (isset($_COOKIE["autologin"])) {
mysql_query("DELETE FROM sessioni WHERE sid='".$_COOKIE["autologin"]."'", $conn);
setcookie('autologin', '', time()-2592000, '/');
}
non cancella nulla dal database

mi rimangono sempre i record delle vecchie sessioni non più valide e devo svuotare la tabella e/o cancellare i record a mano

chi mi dà un ultimo aiutino per capire? :p
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
grazie alessandro, sia per tutto l'aiuto che mi stai dando, anche per il metodo che mi hai suggerito :fonzie:
è ottimo rispetto alle minime esigenze di sicurezza che ho nel mio sitino senza pretese :D

mi spiace essere ancora qui a rompere, ma non cambia nulla togliendo gli apici :S
è nella variabile $time che qualcosa non va, perché se tolgo la condizione WHERE mi cancella tutta la tabella come è giusto che faccia

e per il logout come faccio a cancellare la sessione dalla tabella? il cookie me lo cancella senza problemi :confused:
 

alessandro1997

Utente Attivo
6 Ott 2009
5.302
1
0
23
Roma
alessandro1997.netsons.org
Fammi vedere il codice in cui crei la sessione nel database, forse sbagli ad assegnare la data di scadenza.

Riguardo l'altro problema mi sembra una cosa piuttosto strana... l'unica cosa che mi viene in mente è che quando esegui la query hai già inviato gli header e quindi non puoi leggere i cookie, ma mi pare che la cosa valesse solo per la scrittura. Ma sei sicura che il cookie contenga l'ID di sessione esatto e che sia così anche per la tabella nel database?
 

Silen

Utente Attivo
24 Nov 2008
64
0
0
silen.netsons.org
alessandro ha scritto:
Fammi vedere il codice in cui crei la sessione nel database
ecco
PHP:
$sid=session_id();
$cookie="autologin";
$expires=time()+2592000;
$domain="/";
qui in mezzo verifico l'inserimento di username, password, stato utente e imposto i relativi permessi registrando le variabili
PHP:
if (isset($_POST['login'])) {
setcookie($cookie, $sid, $expires, $domain);
mysql_query("INSERT INTO sessioni(sid, uid, pid, expires) VALUES ('$sid','$id','".$_SESSION["permesso"]."','$expires')", $conn);
}
non mi pare di aver già inviato gli header, perché nel file logout.php,
subito prima del codice che ho postato prima, c'è soltanto un session_start() :confused:

alessandro ha scritto:
Ma sei sicura che il cookie contenga l'ID di sessione esatto e che sia così anche per la tabella nel database?
direi proprio di sì, altrimenti non funzionerebbe proprio tutto quanto e non mi manterrebbe l'utente loggato e autenticato, no?