• User

    Cookie "irriconoscibile"

    Salve a tutti, sto sviluppando un progettino in php e mysql, e funzionerebbe tutto, se non fosse per la gestione degli utenti.

    Tralasciano la soluzione htaccess, funzionale solo su Apache, l'idea era quella di usare le sessioni o i cookie. Con le sessioni nulla di fatto, è stato difficile capirle e ancora peggio usarle.

    Con i cookie sto provando a fare una cosa elementare: in una pagina controllo che l'utente esista, e se esiste setto un cookie e faccio un redirect. Nella pagina successiva controllo se il cookie esiste.
    Nulla di fatto...Viene inizializzato correttamente, ma non viene riconosciuto successivamente. Uso Firefox 3.1, e ho abilitati i cookie. Ho provato anche su explorer ma non viene riconosciuto comunque!

    Dove sto sbagliando??
    Ecco il codice:
    [php]
    include "../config.php";
    include "../lib/_db.php";

    $user = $_POST["username"];
    $pass = md5($_POST["password"]);
    $db = new Database();
    $db->connect();
    $query = "SELECT id, username, password FROM users WHERE username='$user' AND password='$pass'";
    $result = $db->query($query);
    $num_row = mysql_affected_rows();

    if ( $result == true && $num_row !== 0) {
    // utente riconosciuto
    $row = mysql_fetch_array($result);
    //
    //settaggio coockie
    //$cookie_name = $row["id"]."@versioner.com";

    $cookie = setcookie("versioner", $row["username"]);
    header("Refresh: 2; URL=asd.php");

    echo "Utente <b>".$row["username"]."</b> riconosciuto con successo"."<br>\n";
    if ( $cookie ) {
    echo "Cookie inviato con successo";
    }
    else
    echo "Cookie non inviato";

    }
    else
    echo "Utente $user non trovato nel database";

    [/php]
    Questo primo file stampa "Utente nome riconosciuto con successo"
    e "Cookie inviato con successo".

    la pagina asd.php è questa:
    [php]
    if ( isset($_COOKIE) && !empty($_COOKIE) ) {
    echo "cookie riconosciuto";
    echo $_COOKIE["versioner"];
    }
    else
    echo "cookie non riconosciuto";
    [/php]

    Semplici semplici, eppure l'output di questa pagina è "cookie non riconosciuto"...

    Come faccio???

    Inoltre c'è un altro fatto...ossia ho trovato su html.it un articolo che parla di cookie, con uno script per capire se il browser accetta o meno i cookie. Dallo script risulta che non si accetta, ma sotto le impostazioni i cookie sono abilitati, tant'è che ho sul computer alcuni cookie da google e da altri siti...

    PS: PHP è alla versione 5.2.3, quindi $_COOKIE è supportato...


  • User

    Allora, premetto che ho dato un occhiata rapidissima.
    Se fai l'echo della variabile (senza fare il redirect) nel file che crea il cookie lo visualizzi correttamente?


  • User

    Prova a modificare il controllo della seconda pagina come segue:

    if ( isset($_COOKIE["versioner"]) ) {

    L'errore dovrebbe essere questo.


  • User Attivo

    E usare le sessioni? hxxp://it.php.net/manual/en/book.session.php


  • User

    allora..innanzi tutto grazie per le veloci risposte...

    @Horez: ho provato e non stampa nulla...la funzione setcookie() però ritorna true...

    @daniele_tabacco: avevo già provato quella soluzione. In ogni caso ho riprovato e continua a rispondermi "Cookie non riconosciuto"

    @SEO_Italy: premetto che conosco le implicazioni di sicurezza derivanti dall'uso dei cookie come ho descritto nello script. Inoltre avevo già provato ad usarle, ma non c'era verso di farle funzionare.
    Ho scaricato uno script da HTML.it, e ho scaricato anche lo script da questo forum, ma nessuno funzionava...praticamente sembra che in locale non ci sia verso di creare un sistema di autenticazioni funzionante....


  • User Attivo

    Uhm..... Potresti provare a togliere:
    [php]header("Refresh: 2; URL=asd.php");[/php]e magari fare il refresh con un meta tag dell'HTML o magari con un JavaScript?

    P.S.: spero che tu non abbia intenzione di andare in produzione con questo codice qua:
    [php]$user = $_POST["username"];
    $query = "SELECT id, username, password FROM users WHERE username='$user' AND password='$pass'";
    $result = $db->query($query);[/php]!!!!


  • User

    provo con il meta tag...
    basta scrivere
    [php]
    echo "<meta http-equiv="refresh" content="0; url=".$url."" />";
    [/php]

    giusto??

    Per la seconda domanda, prima di tutto fa schifo, e lo so... Detto questo per il momento è una pagina di prova, quindi mi serviva un codice più semplice possibile, ed in secondo luogo il login mi servirebbe unicamente per identificare gli utenti, la sicurezza sarebbe abbastanza in secondo piano...
    visto che ci sono comunque farò in modo di rendere lo script "sicuro", o quanto meno scritto un po' meglio!! :tongueout:


  • User Attivo

    Il meta tag va bene cos', ovviamente lo devi mettere nell'<head></head> (occhio solo alle virgolette...)

    Per quanto riguarda la sicurezza secondo me è meglio sempre scrivere codice sicuro anche se si sviluppa in locale, poi uno magari si dimentica e sono problemi... 😉


  • User

    su quello sono d'accordo...però in questo caso l'applicazione che sto sviluppando è talmente incasinata che piano piano sto mettendo insieme tutti i pezzettini per ottenere qualcosa di accettabile!

    Prova col meta tag e poi aggiorno...


  • User

    Fatta la prova...
    Ma non è cambiato nulla...

    ho inserito questo codice
    [HTML]
    <html>
    <head>
    <meta http-equiv="refresh" content="2; url=asd.php">
    </head>
    <body>
    </body>
    </html>
    [/HTML]
    ma la pagina asd.php continua a stampare cookie non riconosciuto


  • User

    Fatta la prova...
    Ma non è cambiato nulla...

    ho inserito questo codice
    [html]
    <html>
    <head>
    <meta http-equiv="refresh" content="2; url=asd.php">
    </head>
    <body>
    </body>
    </html>
    [/html]
    ma la pagina asd.php continua a stampare cookie non riconosciuto


  • User Attivo

    Scusa in asd.php puoi fare un
    [PHP]echo "<pre>";
    print_r($_COOKIE);
    echo "</pre>";[/PHP]
    e vedere che ti dice?


  • User

    ecco fatto...

    l'output è

    Array()


  • User Attivo

    Ecco, allora vuol dire che il cookie non viene settato nella pagina originaria - però senza vedere tutto il codice, a questo punto, è impossibile capire che succede... Non è che c'è uno spazio o qualcosa prima del PHP? Hai i warning attivati (error_reporting almeno a E_WARNING e display_errors su stdout)?


  • User

    ti posto tutto il codice della pagina...
    [php]
    <?php
    include "../config.php";
    include "../lib/_db.php";

    $user = $_POST["username"];
    $pass = md5($_POST["password"]);
    $db = new Database();
    $db->connect();
    $query = "SELECT id, username, password FROM users WHERE username='$user' AND password='$pass'";
    $result = $db->query($query);
    $num_row = mysql_affected_rows();

    if ( $result == true && $num_row !== 0) {
    // utente riconosciuto
    $row = mysql_fetch_array($result);
    //
    //settaggio coockie
    //$cookie_name = $row["id"]."@versioner.com";
    $cookie = setcookie("versioner", $row["username"]);
    //$cookie = setcookie("versioner", "admin");
    //header("Refresh: 2; URL=asd.php");
    echo "Utente <b>".$row["username"]."</b> riconosciuto con successo"."<br>\n";
    if ( $cookie ) {
    echo "Cookie inviato con successo<br>\n";
    echo "Cookie: ".$_COOKIE["versioner"]."<br>\n";
    }
    else
    echo "Cookie non inviato";
    }
    else
    echo "Utente $user non trovato nel database";

    //controllare che l'utente esista e se esiste settare il coockie
    ?>
    [/php]
    [html]
    <html>
    <head>
    <meta http-equiv="refresh" content="2; url=asd.php">
    </head>
    <body>
    </body>
    </html>
    [/html]

    Tutto qui...non ci sono spazi prima di <?php, e la funzione setcookie() ritorna true...il che è strano visto che di fatto il cookie non viene settato...:gtsad:

    la visualizzazione errori è su E_ALL, quindi mi fa vedere tutto...


  • User Attivo

    Ah, forse ho trovato - mysql_fetch_array restituisce un ARRAY, non un HASH, quindi $row["username"] non dovrebbe esistere! Prova con $row[0] oppure usando mysql_fetch_assoc (o, ancora meglio, usando MDB2, ma questa è un'altra storia...)


  • User

    però aspetta un attimo... my_sql_fetch_array restituisce un array associativo, i cui campi sono nominati a seconda del nome della colonna della taballa da cui sono presi.

    Inoltre se io faccio echo $row["username"], mi viene stampato il valore corretto...Io provo, ma non credo proprio che l'errore sia li.
    Considera inoltre che ho usato sempre quella funzione in quel modo in tutti gli altri script, e non ha mai dato problemi di funzionamento.

    La cosa che mi stupisce è che questi problemi li ho solo quando tento di usare cookie o sessioni. Anche altri script già fatti e sicuramente funzionanti non mi loggano mai correttamente quando li uso in locale. Faccio ancora la prova di uploadare tutto su server e vedere se così funziona...

    Per conoscenza, cos'è MDB2??