Visualizzazione risultati 1 fino 8 di 8

Discussione: Problema con verifica $_SESSION

  1. #1
    Guest

    Predefinito Problema con verifica $_SESSION

    Salve a tutti...io ho uno script di login che usa sia le sessione che i cookies (se richiesto) unico problema è quando devo verificare la sessione o il cookie

    Script:
    Codice PHP:
    <?php
    session_start
    ();
    if(isset(
    $_COOKIE['ID']))
    {
    $user = $_COOKIE['ID'];
    $password = $_COOKIE['Key'];
    $check = mysql_query("SELECT * FROM user WHERE user_password = '$password'")or die(mysql_error());
    while(
    $info = mysql_fetch_array( $check ))
    {
    if (
    $_SESSION['log'] != 1 || $pass != $info['user_password']) {
    header("Location: index.php");
    }else {
    ?>
    admin area
    <?php
    }
    }
    }
    ?>
    tralasciando il fatto che l'impostazione è da cani...lo script non controlla assolutamente nulla e mostra una pagina bianca...se elimino la parte dei cookie lo script funziona perfettamente,dov'è l'errore?
    Grazie anticipatamente!

  2. #2
    Guest

    Predefinito

    Salve.
    Potrebbe mostrarci il codice con il quale crea il coockie ?
    Saluti,
    M.

  3. #3
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    Poco importa come venga creato il cookie, il codice da guardare è quello sopra, che ricopio qua in modo leggibile:
    Codice PHP:
    session_start();

    if (isset(
    $_COOKIE['ID'])) {

    $user = $_COOKIE['ID'];
    $password = $_COOKIE['Key'];

    $check = mysql_query("SELECT * FROM user WHERE user_password = '$password'")
    or die(
    mysql_error());

    while (
    $info = mysql_fetch_array( $check )) {
    if (
    $_SESSION['log'] != 1 || $pass != $info['user_password']) {
    header("Location: index.php");
    } else {
    echo
    "admin area";
    }
    }

    }
    Una indentazione decente spesso è l'unico modo per capirci qualcosa. Se il cookie ID non esiste, non viene mostrato assolutamente nulla, anche se la sessione esiste ( log = 1 ).

    Se il cookie esiste, e si riesce ad arrivare al while, il problema più grosso è la condizione dell'if: se la password è sbagliata per un utente qualsiasi, allora non viene mostrato nulla. Oh, e dovresti usare mysql_fetch_assoc, non _array.

    In più, memorizzando la password nei cookie, hai mille problemi di sicurezza: la password è in chiaro, chiunque può leggerla o modificarla, e se ti manda un pezzo di query SQL questa viene eseguita pari pari, perché non effettui nessuno controllo (e.g. mysql_real_escape_string).


    Se l'hai scritto tu, è quasi completamente da rifare:
    • dividi la parte che effettua i controlli di accesso da quella che mostra la pagina di amministrazione; hai due controlli (sessione o cookie) ed una sola visualizzazione, non mischiarli!
    • non salvare la password in chiaro nei cookie
    • non ti fidare di ciò che arriva dal browser, mentre il contenuto della sessione è affidabile


    Codice:
    se la sessione è attivata 
      allora permetti l'accesso
    altrimenti
      verifica se c'è un cookie
      se l'md5 nel cookie corrisponde all'md5 della password
        allora permetti l'accesso
    
    se l'accesso non è permesso 
      redirigi da un'altra parte
    
    [altrimenti]
    
    mostra la pagina
    Ultima modifica di dreadnaut : 18-08-2009 alle ore 19.31.12

  4. #4
    Guest

    Predefinito

    ti ringrazio per la riposta...ho modificato lo script così

    Codice PHP:
    <?php
    session_start
    ();

    require(
    'connessionedb.php');

    if (
    $_SESSION['log'] == 1) {

    echo
    "admin area";

    } elseif (isset(
    $_COOKIE['ID'])) {

    $user = $_COOKIE['ID'];
    $pass = $_COOKIE['Key'];

    $check = mysql_query("SELECT * FROM user WHERE user_username = '$user'")
    or die(
    mysql_error());

    while(
    $info = mysql_fetch_assoc( $check )) {
    if (
    $pass == $info['user_password']) {

    echo
    "admin area";
    }
    }
    } else {
    header("Location: index.php");
    }
    ?>
    funziona perfettamente ma vorrei un tuo giudizio visto che non è esattamente quello che mi avevi scritto tu...ah altra cosa è che non ho ben capito come usare mysql_real_escape_string.
    Grazie anticipatamente!
    P.S: lo so manca l'md5 poi lo aggiungo...adesso stavo semplicemente testando lo script!
    Ultima modifica di gbtchiaravalle : 20-08-2009 alle ore 11.51.54

  5. #5
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    a parte "admin area" in due punti ed il die() per la query mysql, l'unica cosa strana che vedo e' che se piu' di un utente ha la stessa password, "admin area" viene eseguito piu' volte.

    Buttaci dentro un break, o come scrivevo sopra, setta un flag e poi controllalo alla fine, per sapere se mostrare la pagina oppure no.

  6. #6
    Guest

    Predefinito

    ho messo il break ma mi riporta un errore

    Codice PHP:
    <?php
    session_start
    ();

    require(
    'connessionedb.php');

    if (
    $_SESSION['log'] == 1) {

    echo
    "admin area";
    break;

    } elseif (isset(
    $_COOKIE['ID'])) {

    $user = $_COOKIE['ID'];
    $pass = $_COOKIE['Key'];

    $check = mysql_query("SELECT * FROM user WHERE user_username = '$user'")
    or die(
    mysql_error());

    while(
    $info = mysql_fetch_assoc( $check )) {
    if (
    $pass == $info['user_password']) {

    echo
    "admin area";
    }
    }
    } else {
    header("Location: index.php");
    }
    ?>
    forse non va messo lì? l'errore è questo: Fatal error: Cannot break/continue 1 level in /membri/gbtchiaravalle/prova/homepage.php on line 9

    oppure con le flag intendevi questo?
    Codice PHP:
    <?php
    session_start
    ();

    require(
    'connessionedb.php');

    $utente_abilitato = false;

    if (
    $_SESSION['log'] == 1) {

    $utente_abilitato = true;

    }

    if(isset(
    $_COOKIE['ID'])) {

    $user = $_COOKIE['ID'];
    $pass = $_COOKIE['Key'];

    $check = mysql_query("SELECT * FROM user WHERE user_username = '$user'")
    or die(
    mysql_error());

    while(
    $info = mysql_fetch_assoc( $check )) {
    if (
    $pass == $info['user_password']) {

    $utente_abilitato = true;
    }
    }
    }
    if (
    $utente_abilitato == true) {

    echo
    "admin area";

    } else {
    header("Location: index.php");
    }
    ?>

  7. #7
    L'avatar di dreadnaut
    dreadnaut non è connesso Super Moderatore
    Data registrazione
    22-02-2004
    Messaggi
    6,269

    Predefinito

    Il break si mette nei cicli - intendevo nell'if contenuto nel while. Per il flag, mi sembra corretto, anche li puoi aggiungere il break e saltare un po' di controlli inutili.

  8. #8
    Guest

    Predefinito

    apposto risolto...grazie mille!

    EDIT: sfrutto questa discussione per non farne una nuova...se volessi aggiungere un controllo che blocca il login per un tot di tempo quando l'user sbaglia per 5 volte,come potrei fare?
    Ultima modifica di gbtchiaravalle : 20-08-2009 alle ore 20.10.25

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •