login , cookie , logout

ho realizzato un login che imposta dei cookie , Gianni ti mostro il codice e mi dici se ho fatto bene e se ci sono metodi migliori per farlo : <?php //controlla se è stato inviato il form if(!isset($_POST['Submit'])){ ?> <form id="indexlogin" method="post" action="index.php?act=login" style="margin: 0px;">   <p>     <input name="UserName" type="text" class="login" id="UserName" value="Username" maxlength="32" />     </p>   <p>     <input name="PassWord" type="password" class="login" id="PassWord" value="Password" maxlength="32" />     </p>   <p>     <input name="Submit" type="submit" class="button" value="accedi" />   </p> </form> <?php  } else {  if(!get_magic_quotes_gpc()){     $username = addslashes($_POST['UserName']);    $password = addslashes($_POST['PassWord']);    } else {    $username = $_POST['UserName'];    $password = $_POST['PassWord'];    }      $login_query = "SELECT username,password,uid FROM users WHERE username='".$username."' AND password=md5('".$password."')";      $login_exec  = mysql_query($login_query);     $login_info  = mysql_fetch_array($login_exec);           if(!$login_info){         echo '<p class="error"><b>Errore : </b>nessuna corrispondenza nel database!</p>';       } else {          $preferences_query = "SELECT date FROM settings WHERE user = '".$login_info['uid']."'";          $preferences_exec  = mysql_query($preferences_query);          $preferences_info  = mysql_fetch_array($preferences_exec);                    mysql_query("UPDATE users SET lastaction = '".time()."' LIMIT 1");                    $_SESSION['userlogged']  = TRUE;          $_SESSION['username']    = $login_info['username'];          $_SESSION['date_format'] = $preferences_info['date'];          $_SESSION['lastaction']  = time();             echo 'welcome';                      }    }

?>

questo dovrebbe controllare se è stato trovato il record se si imposta la sessione con i dati ... solo che non posso mettere setcookie qui perchè mi produrrebbe un header already sent ...

cmq se faccio u nredirect alla home appena effettua il login e nella home metto :

session_start();

   if(isset($_SESSION['userlogged'])){
      setcookie('username',$_SESSION['username'],(time()+36000));
      setcookie('userlogged',TRUE,(time()+36000));
      setcookie('date_format',$_SESSION['date_format'],(time()+36000));
      setcookie('lastaction',$_SESSION['lastaction'],(time()+36000));
      }
   if(isset($_COOKE['userlogged'])){
      $username = $_COOKIE['username'];
      $lastact  = $_COOKIE['lastaction']; 
      $date     = $_COOKIE['date_format'];
   } else { 
      $username = $_SESSION['username'];
      $lastact  = $_SESSION['lastaction']; 
      $date     = $_SESSION['date_format'];
   }

se è impostata la sessione userlogged procede ad impostare i cookies ( quindi se è stato effettuato il login )

quindi se sono impostati i cookie usa i cookie per assegnare i valori alle vars altrimenti la sessione

mi sorge una domanda:

posso impostarli subito dopo il login i cookies , diciamo direttamente ?

il codice che ho scritto è corretto come struttura? hanno senso le operazioni che ho fatto con i cookie?

volendo impostare poi una pagina di logout posso usare session_destroy per le sessioni invece per i cookie?

grazie in anticipo

inviato 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Il login mi sembra corretto, anche se contestualmente DEVI inviare il cookie e non aspettare di andare in un'altra pagina. Per il problema degli header fai in modo di non produrre output prima dell'invio dei cookie. Nel cookie inoltre va inviato qualcosa che contenga la password, tipo md5('parola segreta'.$password)

Il controllo dei cookie è invece sbagliato: non verifichi se i dati presenti nel cookie sono di un utente vero e non fai un controllo nel DB. Devi fare una procedura simile a quella del login ma invece di usare i dati che arrivano via POST devi prendere quelli del cookie.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

quindi posso mettere molti più cookie di ora?

tipo:

username

password

lastaction

date_format ( per le impostazioni in modo che ogni utente abbia la data in un formato preferito )

userlogged

e poi dovrei controllare se i cookie sono impostati , se si usare i cookie per fare la query in modo da rifare il login ?

il problema è che uso include per includere le pagine in questo modo <?php //include le pagine da visualizzare if(isset($_GET['act']) && file_exists('acts/' . $_GET['act'] . '.php')){          include('acts/' . $_GET['act'] . '.php');    }else{     include('acts/index.php'); }

?>

e così mi frego la possibilita di mandarli prima dell'output posso inviare i cookie al centro della pagina con ob_start come ho visto sul mio libro questo invierebbe prima il cookie prima di ogni altro output ma devo capire bene si usa , e devo trovare anche un modo veloce ( mannaggia alla velocita!! ) per fare tutto nel minor tempo di esecuzione possibile :D

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

GIanni come imposto i cookies appena effettuato il login?

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

provo a fare una pagina a parte per il login??

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Se vuoi usare i cookie per ricordare l'uente allora ti conviene fare una funzione a cui passi nome e password e ti restituisce true se l'utente è loggato. Così sia se i dati arrivano da POST sia da COOKIE richiami la stessa funzione e sai se l'utente è chi dice di essere.

Non vale la pena mettere tutta quella roba nei cookie, basta solo nome e password (opportunamente criptata, se n'è parlato in un'altra discussione). Capito chi è l'utente basta fare una query e recuperare tutte le sue preferenze, da mettere poi in sessione.

In generale devi sforzarti di produrre l'output solo alla fine dello script, così non avrai problei di cookie.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

md5('parola segreta'.$password) come? nel database ci deve essere l'hash della pass o della pass con la parola?

mi puoi linkare la discussione?

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
modificato 10 anni fa
X 0 X

ho fatto la funzione dimmi se può andare bene :

   function login(){
      if(isset($_POST['Submit'])){
         if(!get_magic_quotes_gpc()){
             $username = addslashes($_POST['UserName']);
            $password = addslashes($_POST['PassWord']);
         } else {
           $username = $_POST['UserName'];
           $password = $_POST['PassWord'];
         }
      } else {
         $username = $_COOKIE['Bb_username'];
         $password = $_COOKIE['Bb_userhash'];
      }
      
        $login_query = "SELECT username,password,uid FROM users WHERE username='".$username."' AND password=md5('".$password."')";
        $login_exec  = mysql_query($login_query);
        $login_result= mysql_num_rows($login_exec);

      if($login_result){       
         setcookie('Bb_username',$username);
         setcookie('Bb_userhash',$password);   
         } else {
            echo '<p class="error"><b>Errore : </b>nessuna corrispondenza nel database!</p>';
         }
   }

cmq devo trovare un modo di impostare i cookie :(

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
modificato 10 anni fa
X 0 X

ho risolto per inviare i cookie al centro della pagina mettendo ob_start(); prima dei tag HTML , comporta l'utilizzo di molta memoria questo?

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

   function login(){       if(isset($_POST['Submit']) && !isset($_COOKIE['Bb_logged'])){          if(!get_magic_quotes_gpc()){              $username = addslashes($_POST['UserName']);             $password = addslashes($_POST['PassWord']);          } else {            $username = $_POST['UserName'];            $password = $_POST['PassWord'];          }       }          $username = $_COOKIE['Bb_username'];          $password = $_COOKIE['Bb_userhash'];       }                $login_query = "SELECT username,password,uid FROM users WHERE username='".$username."' AND password=md5('".$password."')";         $login_exec  = mysql_query($login_query);         $login_result= mysql_num_rows($login_exec);

      if($login_result){                 if(!$_COOKIE['Bb_logged']){            setcookie('Bb_username',$username);            setcookie('Bb_userhash',md5($password));               setcookie('Bb_logged',TRUE);               }            return TRUE;                      } else {             return FALSE;          }    }

porca miseria mi sono incasinato con la logica GIANNIIIII AIUTOO asd mi sono perso a controllare se usano post o cookie : se usa post imposta i cookie se usa i cookie prende i cookie e fa il login

se il login è ok da TRUE ( sia con post che con cookie )

se è errato FALSE

asd mi sono perso :2funny:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Gianni puoi aiutarmi per la funzione?

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Secondo me ti conviene fare qualcosa del genere:

1) Alla registrazione dell'utente, la password va salvata nel DB in questo modo:

$password = md5('supersegreto' . $password);

2) crea una funzione che verifica le generalità dell'utente. La funzione prende come paramentri il nome utente e la password (già trasformata in md5!). La funzione deve restituire true in caso di successo, false altrimenti.

function login($username, $password) ...

Tale funzione si limita a fare una SELECT per vedere se c'è un record con i dati che ha ricevuto.

3) Nella procedura di login, quando l'utente ha inviato i dati via POST, basta prelevare $_POST['UserName'] e $_POST['PassWord'], generare l'md5 della password come mostrato prima e passare questi valori alla funzione login. Se l'esito è positivo e se l'utente l'ha richiesto allora puoi inviare un cookie con $username e $password (sempre in md5)

4) Per attivare il login automatico puoi procede in questo modo. In tutte le pagine del sito, dopo l'istruzione "session_start" verifica se la variabile $_SESSION['userlogged'] esiste. Se non esiste significa che questa è la prima pagina che l'utente visita. Allora controlla la presenza dei cookie. Se ci sono preleva username e password dai cookie e passali alla funzione login che ti dirà se i dati sono corretti. Ovviamente a questo punto dovrai impostare $_SESSION['userlogged'] a true o a false. Se i cookie non ci sono $_SESSION['userlogged'] andrà impostato a false.

5) per il logout devi cancellare la sessione (ultimo esempio http://www.phpnews.it/content/view/74/80/1/2/) ed eliminare i cookie contenenti username e password.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Gianni incredibile c'è l'ho fatta :D ma chi sono?!

   function login(){

   

   global $config;

   

   $method = isset($_POST['Submit']) ? TRUE : FALSE;

   

   if($method){

      if(!get_magic_quotes_gpc()){

             $username = addslashes($_POST['UserName']);

            $password = addslashes(md5($_POST['PassWord']));

         } else {

           $username = $_POST['UserName'];

           $password = md5($_POST['PassWord']);

            } } else { 

         $username = $_COOKIE['Bb_username'];

         $password = $_COOKIE['Bb_userhash'];

      }

        $login_query = sprintf($config['queries']['login'],$username,$password);

        $login_exec  = mysql_query($login_query);

        $login_result= mysql_num_rows($login_exec);

   

   if($login_result && $method){

           setcookie('Bb_username',$username);

           setcookie('Bb_userhash',$password);   

      }

   if($login_result){

      return TRUE; 

      } else {

         return FALSE;

         }

   }   

ti sembra tutto corretto :D

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Secondo me inserire la logica per gestire POST e COOKIE all'interno della funzione login non porta benefici. Si rischia però di complicare la funzione e di perdere in flessibilità.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

come devo fare allora?

a ps : cosi funziona con firefox , con IE no :( exploder del ....

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Segui le linee guida che ti ho riportato prima.  :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

quindi tolgo il controllo COOKIE / PSOT dalla funzione e lo imposto nella index ( pagina che include le altre ) ?

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda