script login con funzione "ricordami" tramite cookie.....

snaker81

Nuovo Utente
22 Lug 2011
14
0
0
Ciao a tutti,
sono nuovo del forum e volevo gentilmente chiedervi un aiuto per quanto riguarda uno script che uso per l'autenticazione. Funziona tutto fino a quando non provo ad attivare la funzione "ricordami".
Prima lavoravo solo con le sessioni, pass criptata sha1 sul db di mysql, creavo la sessione ok.

Avevo bisogno di poter accedere senza ridigitare le pass e ho pensato bene (?) di creare un cookie se l'utente scelglie la casella "ricordami" e se le credenziali sono corrette. Un cookie per l'user e uno per la pass in sha1, ogni volta che l'utente torna sul sito controllo con il db su mysql le credenziali contenute nei cookie.
Ma non va, non ho nessun cookie nel pc, inserisco le credenziali corrette ma mi torna sempre nella pagina di login....

posto il tutto....


index.php (pagina iniziale)

PHP:
<?php   
include("check_login.php");     
#$nick = $_SESSION['nick'];  non so se serve questa definizione 

?>     

<body> 
Benvenuto nell'area riservata! 
</body> 
....

check_login.php
(verifica se l'utente ha già una sessione loggata o un cookie

PHP:
<html> 
<?php  
if(!isset($_SESSION))   
{   
session_start();   
} 

if (!isset($_SESSION["autorizzato"]) || $_SESSION["autorizzato"] != 1)  
      { 
        IF (!isset($_COOKIE['nome'])) { 
            echo "<br><br><font color=666666 size='4'>Area riservata, accesso negato.<br>";    
            echo "<p>Per effettuare il login clicca <a href='main_login.php'><font   
                     color='blue'>qui</font></a>.</p>";   
            die;  
         
    } 
    echo '<script language=javascript>document.location.href="login_verify.php"</script>'; 
} 

?> 
</html>


login_verify.php
fa la verifica delle credenziali inserite nel form o del cookie memorizzato (lo controllo ogni volta che accede l'utente anche se ha il cookie)

PHP:
<html> 
    <head></head> 
    <body> 
<?php     
ob_start();    
if(!isset($_SESSION))   
{   
session_start();   
} 

$log = mysql_connect("localhost","root","") or die("cannot connect");         
          mysql_select_db("sito", $log) or die("cannot select DB");     

IF (isset($_COOKIE['nome'])) { 
    $nick = $_COOKIE['nome']; 
    $pass = $_COOKIE['password']; 
    goto a; 
    } 

# PRIMA DI SALVARE I DATI, EFFETTUA UN CONTROLLO DEI CAMPI  
if (!isset($_POST['nick']) || !isset($_POST['pass'])) {  
    exit;  
}  

if (empty($_POST['nick']) || empty($_POST['pass'])) {  
    echo '<script language=javascript>document.location.href="main_login.php"</script>';  
}  


// username and password inviati dal form     
$nick=strip_tags($_POST['nick']);    
$pass=strip_tags($_POST['pass']); 

a: 

// protezione MySQL injection     
$nick = stripslashes($nick);     
$pass = stripslashes($pass);     
$nick = mysql_real_escape_string($nick);     
$pass = mysql_real_escape_string($pass);     
$pass = sha1($pass); 


$sql="SELECT * FROM users WHERE nickname='$nick' and passsword='$pass'";    


$result=mysql_query($sql); 

# SE NON TROVA TALE OCCORRENZA EFFETTUA REDIRECT AL LOGIN  
if(mysql_num_rows($result) != 1){  
    mysql_close();  
    echo '<script language=javascript>document.location.href="main_login.php"</script>';  
}  

# CREDENZIALI OK - NEL CASO IN CUI L'OCCORRENZA ESISTE CREA LA SESSIONE  

$_SESSION["autorizzato"] = 1;       
$_SESSION['nick'] = $nick; 
if (isset($_POST['ricorda'])) { 
    setcookie("nome", $nick, time()+2592000); 
    setcookie("password", $pass, time()+2592000); 
} 


// Redirect alla pagina riservata 
    echo '<script language=javascript>document.location.href="index.php"</script>';     


mysql_close();  
ob_end_flush(); ?>    

    </body> 
</html>

e in ultimo, se dovesse servire riporto anche il file del form per l'inserimento delle credenziali....

main_login.php
PHP:
<html> 
<head> 
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon" /> 
<link rel="apple-touch-icon" href="icon_ipad.jpg"/> 
<title>PANEL CONTROL</title> 

</head> 


<body> 
<form name="form1" method="post" action="login_verify.php">  
<td>  
     <table border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">   
         <tr>  
             <td colspan="3"><strong><font color=666666>ACCESSO AREA RISERVATA:</font></strong><br><br></td>  
         </tr>  
         <tr>  
             <td width="100"><font color=666666>Nome utente</font></td> <td width="12">:</td>  
             <td width="100"><input name="nick" type="text" id="nick"></td>  
         </tr>   
         <tr>  
             <td><font color=666666>Password</font></td> <td>:</td>   
             <td><input name="pass" type="text" id="pass"></td>  
         </tr>   
         <tr>  
             <td>&nbsp;</td>   
             <td>&nbsp;</td>   
             <td align="right"><input type="submit" name="Submit" value="Entra"></td>  
         </tr>  
         <tr>  
             <td><br><input type="checkbox" name="ricorda"><font color=666666>ricordami</font></td> 
             <td>&nbsp;</td>   
             <td>&nbsp;</td>   
         </tr>  
     </table>  
</td>   
</form> 


</body> 
</html>


Essendo uno script aggiustato un po' alla volta (non creato da me neofita in materia) ci potrebbero essere un po' di strafalcioni, il fatto è che prima di attivare il discorso controllo cookie funzionava. Non so dove sbaglio....
 
ciao
posso sbagliarmi ma non vedo l'istruzione per creare i cookie tipo la seguente

setcookie("nome","valore",time()+(30*24*60*60))

Ciao,
l'istruzione c'è, nel caso in cui l'utente scelga di ricordarsi la volta successiva fa questo 8durata 30gg)

PHP:
if (isset($_POST['ricorda'])) {  
    setcookie("nome", $nick, time()+2592000);  
    setcookie("password", $pass, time()+2592000);  
}

in fondo nel login_verify.php.
 
ciao
scusa non l'avevo visto, comunque puo essere (prova) un IF scritto male, php in certi casi è delicato.
sostituisci con if
poi provo a dare un altro occhio e ti sodire (spero:))
 
ciao
ho provato a riaggiustare (vedi nota vicino a goto a:), non vedo a mio parere altri errori

PHP:
<html> 
<head>
</head> 
<body> 
<?php     
ob_start();  
if(!isset($_SESSION)){session_start();} 
if (isset($_COOKIE['nome'])) { 
    $nick = $_COOKIE['nome']; 
    $pass = $_COOKIE['password']; 
    //goto a; //se hai una versione precedente alla 5.3 goto non funzia
}else{
	// PRIMA DI SALVARE I DATI, EFFETTUA UN CONTROLLO DEI CAMPI  
	if (!isset($_POST['nick']) || !isset($_POST['pass'])) {  
		exit;  
	}
	if (empty($_POST['nick']) || empty($_POST['pass'])) {  
		echo '<script language=javascript>document.location.href="main_login.php"</script>';  
	}  
	// username and password inviati dal form     
	$nick=strip_tags($_POST['nick']);    
	$pass=strip_tags($_POST['pass']); 
}
// protezione MySQL injection     
$nick = stripslashes($nick);     
$pass = stripslashes($pass);     
$nick = mysql_real_escape_string($nick);     
$pass = mysql_real_escape_string($pass);     
$pass = sha1($pass);
$log = mysql_connect("localhost","root","") or die("cannot connect");         
mysql_select_db("sito", $log) or die("cannot select DB"); 
$sql="SELECT * FROM users WHERE nickname='$nick' and passsword='$pass'";    
$result=mysql_query($sql); 
// SE NON TROVA TALE OCCORRENZA EFFETTUA REDIRECT AL LOGIN  
if(mysql_num_rows($result) != 1){  
    mysql_close();  
    echo '<script language=javascript>document.location.href="main_login.php"</script>';  
}  
// CREDENZIALI OK - NEL CASO IN CUI L'OCCORRENZA ESISTE CREA LA SESSIONE  
$_SESSION["autorizzato"] = 1;       
$_SESSION['nick'] = $nick; 
if (isset($_POST['ricorda'])) { 
    setcookie("nome", $nick, time()+2592000); 
    setcookie("password", $pass, time()+2592000); 
} 
// Redirect alla pagina riservata 
echo '<script language=javascript>document.location.href="index.php"</script>'; 
ob_end_flush();
?>
</body> 
</html>
 
grazie mille per l'aiuto.....

in pratica non mi entra, inserisco le credenziali corrette (anche non selezionando l'opsione ricordami) ma non vuole saperne.

ho cambiato check_login (incluso nelle pagine protette) come segue (perchè nel caso il cookie vada bene deve accedere alla pagina, invece così continuava a fare la verifica a rindondanza..)

PHP:
<?php 
if(!isset($_SESSION))  
{  
session_start();  
}

IF (isset($_COOKIE['nome'])) {
    if ($_SESSION["autorizzato"] != 1) {   //entro solo se il cookie non è già stato verificato
    echo '<script language=javascript>document.location.href="login_verify.php"</script>';
    die;
    }
}

   
if (!isset($_SESSION["autorizzato"]) || $_SESSION["autorizzato"] != 1) 
      {
            echo "<br><br><font color=666666 size='4'>Area riservata, accesso negato.<br>";   
            echo "<p>Per effettuare il login clicca <a href='main_login.php'><font  
                     color='blue'>qui</font></a>.</p>";  
            die; 
        
    }
    


?>

nel login_verify invece non so che fare.
posto la versione che uso ora e funziona, che a differenza dell'altra non verifica il contenuto dei cookie.

PHP:
<html>
    <head></head>
    <body>
<?php    
ob_start();   
if(!isset($_SESSION))  
{  
session_start();  
}

$log = mysql_connect("localhost","root","") or die("cannot connect");        
          mysql_select_db("sito", $log) or die("cannot select DB");    



# PRIMA DI SALVARE I DATI, EFFETTUA UN CONTROLLO DEI CAMPI 
if (!isset($_POST['nick']) || !isset($_POST['pass'])) { 
    exit; 
} 

if (empty($_POST['nick']) || empty($_POST['pass'])) { 
    echo '<script language=javascript>document.location.href="main_login.php"</script>';
    die;
} 


// username and password inviati dal form    
$nick=strip_tags($_POST['nick']);   
$pass=strip_tags($_POST['pass']);


// protezione MySQL injection    
$nick = stripslashes($nick);    
$pass = stripslashes($pass);    
$nick = mysql_real_escape_string($nick);    
$pass = mysql_real_escape_string($pass);    
$pass = sha1($pass);


$sql="SELECT * FROM users WHERE nickname='$nick' and password='$pass'";   


$result=mysql_query($sql);

# SE NON TROVA TALE OCCORRENZA EFFETTUA REDIRECT AL LOGIN 
if(mysql_num_rows($result) != 1){ 
    mysql_close(); 
    echo '<script language=javascript>document.location.href="main_login.php"</script>';
    die;
} 

# CREDENZIALI OK - NEL CASO IN CUI L'OCCORRENZA ESISTE CREA LA SESSIONE 

$_SESSION["autorizzato"] = 1;      
$_SESSION['nick'] = $nick;
if (isset($_POST['ricorda'])) {
    setcookie("ricordami_prox", "cred_ok", time()+2592000);
}


// Redirect alla pagina riservata
    echo '<script language=javascript>document.location.href="index.php"</script>';    


mysql_close(); 
ob_end_flush(); ?>   

    </body>
</html>


e questa la versione CHE NON FUNZIONA....

PHP:
<html>
    <head></head>
    <body>
<?php    
ob_start();   
if(!isset($_SESSION))  {session_start();}

$log = mysql_connect("localhost","root","") or die("cannot connect");        
          mysql_select_db("sito", $log) or die("cannot select DB");    

IF (isset($_COOKIE['nome'])) {
    $nick = $_COOKIE['nome'];
    $pass = $_COOKIE['password'];
    }
else{
    # PRIMA DI SALVARE I DATI, EFFETTUA UN CONTROLLO DEI CAMPI 
    if (!isset($_POST['nick']) || !isset($_POST['pass'])) { 
        exit; 
    } 
    
    if (empty($_POST['nick']) || empty($_POST['pass'])) { 
        echo '<script language=javascript>document.location.href="main_login.php"</script>';
        die;
    } 
    
    
    // username and password inviati dal form    
    $nick=strip_tags($_POST['nick']);   
    $pass=strip_tags($_POST['pass']);

}

// protezione MySQL injection    
$nick = stripslashes($nick);    
$pass = stripslashes($pass);    
$nick = mysql_real_escape_string($nick);    
$pass = mysql_real_escape_string($pass);    
$pass = sha1($pass);


$sql="SELECT * FROM users WHERE nickname='$nick' and password='$pass'";   


$result=mysql_query($sql);

# SE NON TROVA TALE OCCORRENZA EFFETTUA REDIRECT AL LOGIN 
if(mysql_num_rows($result) != 1){ 
    mysql_close(); 
    echo '<script language=javascript>document.location.href="main_login.php"</script>';
    die;
} 

# CREDENZIALI OK - NEL CASO IN CUI L'OCCORRENZA ESISTE CREA LA SESSIONE 

$_SESSION["autorizzato"] = 1;      
$_SESSION['nick'] = $nick;
if (isset($_POST['ricorda'])) {
    setcookie("nome", $nick, time()+2592000);
    setcookie("password", $pass, time()+2592000);
}


// Redirect alla pagina riservata
    echo '<script language=javascript>document.location.href="index.php"</script>';    


mysql_close(); 
ob_end_flush(); ?>   

    </body>
</html>


grazie.....
 
ho fatto na verifica e c'è qualcosa che non va nel check_login che includo nelle varie pagine protette.

la mia situazione è:
1) non ho nessun cookie salvato
2) la sessione "autorizzato" non è aperta (e quindi anche diversa da 1)

il mio check login dovrebbe indirizzarmi alla main_login, in realtà mi va sulla verify_login. come mai?

riporto il codice (ho inglobato un if rispetto al post precedente):

PHP:
<?php 
if(!isset($_SESSION))  {session_start();}

   
if (!isset($_SESSION["autorizzato"]) || $_SESSION["autorizzato"] != 1) 
      {
        IF (isset($_COOKIE['nome'])) {
            echo '<script language=javascript>document.location.href="login_verify.php"</script>';
            die;
        }
            echo "<br><br><font color=666666 size='4'>Area riservata, accesso negato.<br>";   
            echo "<p>Per effettuare il login clicca <a href='main_login.php'><font  
                     color='blue'>qui</font></a>.</p>";  
            die; 
        
    }
?>

lo script non deve fare nulla (e quindi farmi continuare nelle pagine protette) nel caso in cui la sessione autorizzato sia = a 1 (può diventare 1 nel caso in cui le credenziali sono giuste o il cookie salvato contiene le credenziali giuste).

:dipser:
 
ciao
forse è meglio ricapitolare un po'
1. tu hai un form in cui inserisci user e pass e puoi scegliere se ricordare user e pass
2. il form punta alla pag login_verify.php
3. la pag login_verify.php deve verificare
a) i cookies esistono?
b) se si reindirizzi alla pagina riservata
c) se no deve verificare l'user e pass inseriti
d) se user e pass inseriti sono giusti
d1) se hai messo "ricordami" crei i cookies
d2) reindirizzi alla pagina riservata
e) se user o pass errate reindirizza alla login
sin qui è giusto?
nota io metterei nel form
<input type="checkbox" name="ricorda" value="R">
cioè il valore al check
se si, io proverei a fare in questo modo
PHP:
<?php
ob_start();
if(!isset($_SESSION)){session_start();}
//verifichi che entrambi i cookie esistano
if(isset($_COOKIE['nome']) && isset($_COOKIE['password'])){
	/*se esistono li passi in sessione
	in modo che nella pag riservata verivichi solo le sessioni e non i cookie*/
	$_SESSION["autorizzato"] = 1;       
	$_SESSION['nick'] = $_COOKIE['nome'];
	//e qui reindirizzi alla pag riservata
}else{//i cookie non esistono
	//raccogli e verifichi l'invio dal form
	$nick=mysql_real_escape_string(stripslashes(strip_tags(trim($_POST['nick']))));    
	$pass=sha1(mysql_real_escape_string(stripslashes(strip_tags(trim(($_POST['pass'])))));
	//se vuoti rimandi a dove vuoi
	if($nick ==="" || $pass ===""){
		//qui rimandi a dove vuoi
	}else{
		//$nick e $pass non vuoti
		//qui i dati di connessione
		$result=mysql_query("SELECT * FROM users WHERE nickname='$nick' and passsword='$pass'");
		$sono_giuste=mysql_num_rows($result);
		if($sono_giuste !=1){//sono giuste
			//verifichi il ricorda
			if(isset($_POST['ricorda']) && $_POST['ricorda']=="R"){//se si crei i cookie
				setcookie("nome", $nick, time()+2592000); 
				setcookie("password", $pass, time()+2592000);
			}
			$_SESSION["autorizzato"] = 1;       
			$_SESSION['nick'] = $nick;
			//e qui reindirizzi alla pag riservata
		}else{
			//rimandi a dove vuoi
		}
	}
}
ob_end_flush();
?>
poi nella pag riservata farei

PHP:
<?php
if(!isset($_SESSION['nick']) || !isset($_SESSION['autorizzato']) || $_SESSION['autorizzato'] !=1){
	//rimandi a dove vuoi
}else{
	//visualizzi la riswrvata
?>
<html>
<head>
<!-- codice....-->
</head>
<body>
<!-- codice....-->
</body>
</html>
<?php
}
?>
piccola nota
al posto di JS per i rimandi (il js può essere aggirato) usa php
header("location: pagina_a_cui_vuoi_rinviare.htm");


p.s.
provalo al massimo non funzia, l'ho buttato giù di getto
 
ciao
forse è meglio ricapitolare un po'
1. tu hai un form in cui inserisci user e pass e puoi scegliere se ricordare user e pass
2. il form punta alla pag login_verify.php
3. la pag login_verify.php deve verificare
a) i cookies esistono?
b) se si reindirizzi alla pagina riservata
c) se no deve verificare l'user e pass inseriti
d) se user e pass inseriti sono giusti
d1) se hai messo "ricordami" crei i cookies
d2) reindirizzi alla pagina riservata
e) se user o pass errate reindirizza alla login
sin qui è giusto?

1. nelle pagine riservate includo check_login.php che mi verifica:
- se l'accesso è già stato fatto e la sessione autorizzato è =1 (vado nella pagina riservata)
- se i cookie esistono (che poi veriico nel login_verify)
2. dal check_login :
- o vado alla pagina riservata
- o entro nel login_verify.php per verificare i cokie salvati
- o accedo al form di login per inserire i dati
3. nel login_verify
- VERIFICO i cookie salvati (user e pass) ----> questo è la grossa differenza che mi ha creato il problema e che nel script riportato anche da te non viene eseguita (è importante secondo me...)

il resto è come da te gentilmente descritto....

Adesso vedo di fare qualche modifica anche in base a quanto da te suggerito.

grazie mille intanto....davvero gentile
:fonzie:
 
ho risolto finalmente.......

ho fatto anche le modifiche da te suggerite (in parte) e ti ringrazio.

Adesso lo script verifica se ci sono i cookie, se questi sono ancora validi (user e pass), se non sono valide distrugge i cookie e rimanda al login altrimenti l'utente accede.

grazie!
 
salve, io non ho letto tutto , ma non capisco perché si deve salvare la password?

io al genere leggo un campo criptato diverso del campo password.

Non capisco perché si deve salvare nei cookie l'username e la password ?

me lo potete spiegare?

grazie mille.
 
ciao
...ma non capisco perché si deve salvare la password?
cosa intendi per salvare? dato che puoi avere più utenti e quindi più pass è evidente che da qualche parte le pass devono essere registrate.
generalmente vengono registrate (salvate) criptate (md5 o sh1) in un db (es. mysql) in modo da rendere impossibile o quasi il loro utilizzo da parte di malintenzionati.
...io al genere leggo un campo criptato diverso del campo password.
cioè usi due campi? uno per la pass in chiaro ed uno per la pass criptata? se è così non è un metodo molto sicuro, le pass è sempre meglio solo criptate
...non capisco perché si deve salvare nei cookie l'username e la password?
vengono messe nei cockie perchè l'utente accreditato, quando esce e poi rientra (entro un tempo prestabilito, vita del cookie) non abbia bisogno di ridigitare la sua pass e l'user.
poi in funzione dei controlli che fai puoi mettere nel cokie la pass o la pass e l'user
 
ciao

cosa intendi per salvare? dato che puoi avere più utenti e quindi più pass è evidente che da qualche parte le pass devono essere registrate.
generalmente vengono registrate (salvate) criptate (md5 o sh1) in un db (es. mysql) in modo da rendere impossibile o quasi il loro utilizzo da parte di malintenzionati.

cioè usi due campi? uno per la pass in chiaro ed uno per la pass criptata? se è così non è un metodo molto sicuro, le pass è sempre meglio solo criptate

vengono messe nei cockie perchè l'utente accreditato, quando esce e poi rientra (entro un tempo prestabilito, vita del cookie) non abbia bisogno di ridigitare la sua pass e l'user.
poi in funzione dei controlli che fai puoi mettere nel cokie la pass o la pass e l'user

Io salvo solo login=true/flase e user_crypt
e poi recupero tutto con questo codice:

PHP:
<?php
if (isset($_COOKIE["login_a"]) !="" ){
$_SESSION['login'] = $_COOKIE["login_a"];
$_SESSION["user_crypt"] = $_COOKIE["user_crypt"];
}elseif(isset($_SESSION['login']) == true)
{
}
else
{
$msg = "Non hai fatto i login";
}
?>

e poi io per recuperare nome/id uso queste funzioni che mi sono creato:
PHP:
function get_username ( $id )
	{
		global $db;
		$query = $db->query("SELECT * FROM `utenti` WHERE user_crypt = '" . $db->real_escape_string($id) . "'");
		
		if ( mysqli_num_rows ( $query ) == 1 )
		{
			$row = mysqli_fetch_array ( $query );
			
			return $row['user'];
		}
		else {
			return FALSE;
		}
	}
	
	function get_userID ( $id )
	{
		global $db;
		$query = $db->query("SELECT * FROM `utenti` WHERE `user_crypt` = '" . $db->real_escape_string($id) . "'");
		
		if ( mysqli_num_rows ( $query ) == 1 )
		{
			$row = mysqli_fetch_array ( $query );
			
			return $row['id'];
		}
		else {
			return FALSE;
		}
	}

e le chiamo cosi:
<?php echo get_username($_SESSION["user_crypt"]);
echo get_userID($_SESSION["user_crypt"]); ?>

Mi dici se va bene lo stesso?

io faccio ricordare il campo user_crypt ... ma non salvo mai la password ne in chiaro e ne criptata nei cookie..

uso un hash quando l'utente si e registrato ed ho salvato l'hash md2 in un campo "user_crypt" che segue questo formato: user+time()+indirizzo ip.


mi dici se va bene?

grazie mille.
 
Ultima modifica:

Discussioni simili