Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [PRESTAZIONI] login al sito (con i cookie)

    Per problemi avuti con il sito, stavo cercando un metodo per ottimizzare la ricerca se l'utente si era già loggato al sito oppure no.

    Premetto che il login viene settato con un cookie ( non utilizza sessioni ) e viene conservato per un lungo periodo, ovviamente si può anche ridurre il tempo.

    Ora parliamo un pò del codice:
    Il cookie ovviamente viene impostato se il nome utente (o l'email) e la password (l'md5 della password) sono presenti in un record.

    [Piccola premessa: Questa mini guida non serve se avete 100 visite al giorno o meno di 1000 utenti nel db, ovviamente può comunque essere letta da tutti per un approfondimento]

    Pagina del login:
    ( Ammettendo che viene fatto il controllo con magic_quotes o meglio un espressione regolare per validare i dati in POST )
    Codice PHP:
    if (isset($_POST['user'],$_POST['pass'])) {
    $sql['user']=mysql_query("SELECT * FROM user WHERE pass='" md5($_POST['pass']) . "' AND user='{$_POST['user']}' LIMIT 1");
    // Continua 
    qui viene fatto il controllo se è stato trovato almeno un record, se si: viene inserito il cookie, ed è qui il fulcro di questa mini-guida.

    Il cookie chiamato per esempio $_COOKIE['site_user'], viene impostato assumendo questa forma:
    "12i52bc309e11259af15e4623c7a0abc28c"

    Passiamo alla descrizione del cookie, a prima vista potrebbe sembrare un normale hash di qualche stringa, ma non è cosi: tutti i numeri trovati prima del carattere i (che sta per id, ma potete impostare qualunque altro carattere) corrispondono all'id del record. ( il campo id della tabella inutile dirlo è anche il primario )

    tutti i caratteri succesivi sono 32 e rappresentano il vero è proprio hash, in questo caso md5( di una certa stringa ) escluso il carattere i.

    Passiamo alle poche righe di codice che continuano da sopra:
    Codice PHP:
    // Ammesso che sia stato trovato un record
    $sql['user']['row']=mysql_fetch_assoc($sql['user']);
    $cookie_value $sql['user']['row']['id'] . 'i' md5$sql['user']['row']['email'] . $sql['user']['row']['pass'] );
    // Come vedete l'hash inserito dopo l'id corrisponde alla somma della stringa dell'email più l'hash diretto della password conservata nel db
    setcookie'user_site' $value_cookie  , (time()+86400*365) , '/' ); 
    A questo punto è stato salvato il cookie.
    In ogni pagina del sito per effettuare il controllo se l'utente visitatore è loggato o no bisongerà fare:

    Codice PHP:

    if ( isset( $_COOKIE['site_user'] ) AND 
         
    preg_match'#^([0-9]+)i([a-z0-9]{32})$#i' $_COOKIE['site_user'] , $matches 
      ) {
    $cookie_id $matches[1];
    $cookie_session $matches[2];
    // Viene controllata la presenza del cookie e viene fatto un controllo "validazione" con preg

    mysql_query("SELECT * FROM user WHERE id = $cookie_id LIMIT 1");
    // E controllare se $cookie_session corrisponde agli effettivi valore (salto la funzione mysql_fetch_assoc)

    if ($cookie_session md5$row['email'] . $row['pass'] )  ) {
      
    // UTENTE LOGGATO
       
    define('USER_LOG',TRUE);
    } else
       
    define('USER_LOG',FALSE);



    cosi facendo dovremmo eseguire solo una query e inotlre cosa più importante la clausola where andrà a selezionare i record attraverso il campo primario ID che notoriamente è una sintassi corretta rispetto ad un'altra che seleziona i record in base ad un campo per esempio VARCHAR(32) che non è nenache un indice.

    Attualmetne sto effettuando dei test per vedere se ci sono problemi o cose varie ma sembra andare tutto alla grande.

    ( Non so se si può considerare una pillola fate vobis )

    Se interessa a qualcuno ovviamente può anche essere espansa con alcuni semplici "mod" (Come per esempio controllare quanti utenti sono online senza usare altre tabelle, o quali pagine stanno visitando attualmente)

    Saluti

  2. #2
    immaginavo che non avrebbero partecipato troppe persone per quest'argomento un pò di nicchia

    anche se 40 visite neanche una risposta

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.