Visualizzazione risultati 1 fino 4 di 4

Discussione: [PHP] Confermare tramite Email la registrazione.

  1. #1
    L'avatar di wuston
    wuston non è connesso Utente giovane
    Data registrazione
    12-11-2008
    Residenza
    Roma
    Messaggi
    47

    Predefinito [PHP] Confermare tramite Email la registrazione.

    Salve,

    Non desidero la soluzione, bensì una spiegazione teorica alla risoluzione del problema.
    Vorrei arrivare per ragionamento, vorrei capire l'errore per imparare! C=

    Devo capire l'errore, il punto in cui la logica del file non torna e mi crea questo errore, oppure direttamente la correzione, ma devo capire tutto quindi seguita da una spiegazione, voglio imparare! =D


    L'algoritmo effettua:

    1. Creazione tabelle nel database;
    2. Registrazione di un account: Nome, Cognome, Nickname (utilizzato per accedere) Password ed Email.
    3. Un email invia Nickname e Password, e un link per confermare la registrazione.
    4. Avviene in confronto del codice alfanumerico di 32 caratteri presente sul database e quello presente nel link per completare la registrazione e qui E' ERRORE!



    In pratica (sintesi):

    Mi registro, un email mi invia un link di conferma con un codice di 32 caratteri alfanumerici.

    Tipo:
    http://MIOSITOWEB/conferma_registrastrazione.php?id= e un codice di 32 caratteri

    Ora deve fare il confronto con la tabella CONFIRM_VALIDATOR quando clicco il link (che contiene questo codice alfanumerico). Se il codice del link è uguale a quello della tabella, la tabella CONFIRM_USERID aumenta da 0 a 1!

    Ma siccome il link conduce ad una pagina di errore (pagina non trovata) e non avviene il confronto per un motivo che mi sfugge l'account non si può convalidare mai! ^-^

    Passiamo al codice:

    file: conferma_registrazione.php

    Codice PHP:
    <?php
    require('db.php');
    $id = $_GET['id'];
    $sql = "SELECT * FROM confirm WHERE confirm_validator = '$id'";

    $query = mysql_query($sql) or die(mysql_error());

    $pcarray = mysql_fetch_array($query); // Memorizza nell'array

    $pcarray if (!is_array($pcarray)) {

    echo
    "Oops! Niente da confermare!";
    exit; }

    $user_id = $pcarray["confirm_userid"];

    // Aggiorna la tabella user
    $update = "UPDATE user SET " . "user_reg = 1 " . "WHERE user_id = '$user_id'";

    $result = mysql_query($update) or die(mysql_error());
    ?>

    <html> <head> <title>Iscrizione confermata!</title> </head> <body> <h3>Complimenti, la tua iscrizione al sito è stata confermata!</h3><br> <p><a href="index.php">Clicca qui per tornare alla Home Page ed effettuare il log-in</a></p> </body> </html>
    Questa è la pagina che si occupa di ricevere il link e di fare il confronto di codice, facendo l'update della tabella da 0 a 1 se il codice corrisponde, attivando quindi l'account!

    file: creazione_tabelle.php

    Codice PHP:



    <?php

    // Istruzioni collegamento con il Database
    require('db.php');

    $query = "CREATE TABLE user (
    user_id INT(11) NOT NULL AUTO_INCREMENT,
    user_firstname VARCHAR (50) NOT NULL,
    user_lastname VARCHAR (50) NOT NULL,
    user_username VARCHAR (11) NOT NULL,
    user_password VARCHAR (32) NOT NULL,
    user_email VARCHAR (50) NOT NULL,
    user_reg TINYINT (1) NOT NULL default 0,
    PRIMARY KEY (user_id))"
    ;
    $users = mysql_query($query) or die(mysql_error());
    $user = mysql_real_escape_string($_POST['user']);


    $qry = "CREATE TABLE confirm (
    confirm_id INT(11) NOT NULL AUTO_INCREMENT,
    confirm_validator VARCHAR (32) NOT NULL,
    confirm_userid INT (11) NOT NULL default 0,
    PRIMARY KEY (confirm_id))"
    ;
    $confirm = mysql_query($qry) or die(mysql_error());
    ?>
    Questa pagina si occupa di creare le due tabelle CONFIRM E USER.







    file: registrazione.php

    Codice PHP:

    <?php
    require('db.php');

    $user = mysql_real_escape_string($_POST['user']);
    $user_mail = $_POST['user'];

    //Hash per non memorizzare il valore originale della password
    $pass = md5($_POST['pass']);




    $pass_mail = $_POST['pass'];
    $firstname = mysql_real_escape_string($_POST['firstname']);
    $lastname = mysql_real_escape_string($_POST['lastname']);


    //Verifico che NickName e Email non siano già presenti sul DataBase
    $query = "SELECT * FROM user " .
    "WHERE user_username = '$user' " .
    "OR user_email = '$pass' ";

    $result = mysql_query($query) or die (mysql_error());

    if (
    mysql_num_rows($result) != 0)
    {
    while (
    $row = mysql_fetch_array($result))
    {
    //Se il nickname esiste
    if ($row['user_username'] == $user)
    {
    echo
    "<p>";
    echo
    "L'username, <b>" . $row['user_username'] . "</b> è già in uso da un altro utente, scegliere uno diverso";
    echo
    "</p>";
    }
    //Se l'email esiste
    if ($row['user_email'] == $_POST['email'])
    {
    echo
    "<p>";
    echo
    "La casella E-mail, <b>" . $row['user_email'] . "</b> è già presente nel DataBase, scegliere una diversa";
    echo
    "</p>";
    }
    }
    //Torna alla pagina di registrazione se esistono
    echo "<p>";
    echo
    "<a href=\"registrazione.php\">";
    echo
    "<-- Clicca qui per ritornare alla pagina precedente";
    echo
    "</a>";
    echo
    "</p>";
    exit();
    }

    //Se non sono presenti nel DataBase
    else
    {
    switch (
    $_GET['action'])
    {
    case
    "add":
    switch (
    $_GET['type'])
    {
    case
    "user":
    $sql = "INSERT INTO user
    (user_firstname,
    user_lastname,
    user_username,
    user_password,
    user_email)
    VALUES
    ('
    $firstname',
    '
    $lastname',
    '
    $user',
    '
    $pass',
    '"
    . $_POST['email'] . "')";
    $users = mysql_query($sql) or die(mysql_error());
    $id = mysql_insert_id();
    // Recupero l'ID (user_id) dell'utente appena registrato
    break;
    }
    break;
    }
    }

    //Andiamo avanti assegnando un valore casuale alla variabile $msgid che contiene un valore identificativo che viene inserito nella tabella confirm. (utilizzo MD5 e Hasho)

    $temp = gettimeofday();
    $msec = (int) $temp["usec"];
    $msgid = md5(time() . $msec);
    $ins = "INSERT INTO confirm
    (confirm_validator,
    confirm_userid)
    VALUES
    ('
    $msgid',
    '
    $id')";
    $res = mysql_query($ins) or die(mysql_error());
    ?>

    <html>
    <head>
    <title>Inserimento dati</title>
    </head>
    <body>
    <?php

    //Invio un Email contentente NickName, password in chiaro e link per confermare la registrazione.


    $to = $_POST["email"];
    $toname = $_POST["firstname"];
    $subject = "Completa la tua registrazione";

    $boundary = "==MP_Bound_xyccr948x==";
    $headers = "MIME-Version: 1.0\r\n";
    $headers .= "Content-type: multipart/alternative; boundary=\"$boundary\"\r\n";
    $headers .= "From: miaemail@gmail.com \r\n";
    $html_msg = "<center>";
    $html_msg .= "<table width=\"500\" border=0 cellpadding=\"4\">";
    $html_msg .= "<tr><td align=\"center\">&nbsp;";
    $html_msg .= "</td></tr>";
    $html_msg .= "<tr><td>Questi sono i dati della tua registrazione:";
    $html_msg .= "</td></tr><tr><td>Username: <font color=\"red\">" . $user_mail . "</font>";
    $html_msg .= "</td></tr><tr><td>Password: <font color=\"red\">" . $pass_mail . "</font>";
    $html_msg .= "</td></tr><tr><td align=\"center\">&nbsp;";
    $html_msg .= "</td></tr></table></center>";
    $confirmmessage = "Salve " . $toname . ",\n\n";
    $confirmmessage .= "per completare la tua registrazione devi cliccare sul link sottostante:\n\n";
    $confirmmessage .= $html_msg . "\n\n";
    confirm_reg.php
    $confirmmessage
    .= "<a href=\"http://MIOSITOWEB/conferma_registrazione.php" .
    "?id=$msgid\">Clicca qui per confermare la tua registrazione</a>";
    $message = "This is a Multipart Message in MIME format\n";
    $message .= "--$boundary\n";
    $message .= "Content-type: text/html; charset=iso-8859-1\n";
    $message .= "Content-Transfer-Encoding: 7bit\n\n";
    $message .= $confirmmessage . "\n";
    $message .= "--$boundary--";
    $mailsent = mail($to, $subject, $message, $headers);
    if (
    $mailsent)
    {
    echo
    "Salve" . $toname . ",<br>";
    echo
    "Un messaggio è stato inviato all'indirizzo <b>" . $to . "</b> da te fornito.<br><br>";
    echo
    "IMPORTANTE:<br>";
    echo
    "Per completare la registrazione al sito devi aprire la tua casella e-mail, leggere il messaggio di conferma e cliccare sul link che troverai all'interno.<br><br>";
    } else {
    echo
    "Errore durante l'invio dell'e-mail.";
    }
    ?>
    </body>
    </html>
    Questo è il file della registrazione, si occupa di controllare la compilazione del form, di inviare i dati ad un altro file che successivamente li riporta sul database, e di inviare l'email con nick, password e codice di attivazione.


    Spero di essere stato molto chiaro nella spiegazione e che siccome tutti quanti sono passati dalle basi della programmazione, spero quindi di essere aiutato a capire almeno la logica che mi ha fatto sbagliare, voglio imparare tutto, migliorare! =))


    Grazie dell'attenzione, una buona giornata! ^-^
    Imparare A Programmare E' Il Mio Obiettivo!!!

  2. #2
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,683

    Predefinito

    Prima di usare una variabile ($_GET['id']), dovresti prima verificare che esista con la isset().


    Cosa centra $pcarray qui?:
    Codice PHP:
    $pcarray if (!is_array($pcarray)) {
    .

    in registrazione.php, ovviamente hai sostituito MIOSITOWEB, con wuston.altervista.org ?
    Codice:
    <a href=\"http://MIOSITOWEB/conferma_registrazione.php" . 
      "?id=$msgid\">
    Personalmente, invece di fare una tabella "CONFIRM", aggiungo un campo alla tabella user, ad esempio "accesso". Se vale 1 è attivato (e quindi può fare il login), mentre altrimenti non è attivato. Quindi, per attivarlo, non faccio altro che sostituire la stringa generata casualmente (che non servirà più), con 1.
    Quindi nella pagina di attivazione, faccio semplicemente:
    Codice PHP:
    <?php
    if(!isset($_GET['s']))
    die();
    if(
    strlen($_GET['s']) != 32)
    die(
    'Codice NON accettato...');
    $db=mysql_connect("localhost","alemoppo", "");
    if(
    $db == FALSE)
    die(
    'Errore con la connessione al database!');
    if(!
    mysql_select_db("my_alemoppo",$db))
    die(
    'Errore con la selezione al database!');
    $ris = mysql_query("UPDATE registrati SET accesso='1' WHERE accesso='".$_GET['s']."'",$db);
    if(!
    $ris)
    die(
    'Errore con la compilazione dati con il database!');

    header("Location: ./ok.htm");
    ?>
    [*] questa pagina l'ho fatta molto tempo fa. Potrebbero esserci soluzioni migliori, ma quello che deve fare lo fa


    Ciao!
    Ultima modifica di alemoppo : 22-05-2011 alle ore 13.46.18

  3. #3
    L'avatar di wuston
    wuston non è connesso Utente giovane
    Data registrazione
    12-11-2008
    Residenza
    Roma
    Messaggi
    47

    Predefinito

    Prima di usare una variabile ($_GET['id']), dovresti prima verificare che esista con la isset().
    Provvedo a fare il controllo tramite isset().



    Cosa centra $pcarray qui?:
    Codice PHP:
    $pcarray if (!is_array($pcarray)) {
    .
    Nulla, sbagliato dovrebbe stare nella riga sopra (nel commento)
    Ma nel mio file è corretto quindi sorvoliamo.



    in registrazione.php, ovviamente hai sostituito MIOSITOWEB, con wuston.altervista.org ?
    Codice:
    <a href=\"http://MIOSITOWEB/conferma_registrazione.php" . 
      "?id=$msgid\">
    Si, naturale! C=

    Personalmente, invece di fare una tabella "CONFIRM", aggiungo un campo alla tabella user, ad esempio "accesso". Se vale 1 è attivato (e quindi può fare il login), mentre altrimenti non è attivato. Quindi, per attivarlo, non faccio altro che sostituire la stringa generata casualmente (che non servirà più), con 1.
    Quindi nella pagina di attivazione, faccio semplicemente:
    Codice PHP:
    <?php
    if(!isset($_GET['s']))
    die();
    if(
    strlen($_GET['s']) != 32)
    die(
    'Codice NON accettato...');
    $db=mysql_connect("localhost","alemoppo", "");
    if(
    $db == FALSE)
    die(
    'Errore con la connessione al database!');
    if(!
    mysql_select_db("my_alemoppo",$db))
    die(
    'Errore con la selezione al database!');
    $ris = mysql_query("UPDATE registrati SET accesso='1' WHERE accesso='".$_GET['s']."'",$db);
    if(!
    $ris)
    die(
    'Errore con la compilazione dati con il database!');

    header("Location: ./ok.htm");
    ?>
    [*] questa pagina l'ho fatta molto tempo fa. Potrebbero esserci soluzioni migliori, ma quello che deve fare lo fa


    Ciao!
    Si non fa una pecca il ragionamento, ma in termine di sicurezza è scarso come risultato, funzionante, ma da ottimizzare C=

    Quindi la seconda tabella la vedo necessaria per un controllo maggiore, al limite posso unirle e renderla tutta una.

    Devo capire per quale motivo non confronta il codice della mail con il codice nel database =) La pagina di conferma funziona, se ci vado mi dice che il codice è sbagliato (visto che non ce n'è), ma se accedo alla pagina tramite email da pagina non trovata!

    Sai darmi qualche altra dritta? C= Grazie

    EDIT:

    Prima di usare una variabile ($_GET['id']), dovresti prima verificare che esista con la isset().

    Provvedo a fare il controllo tramite isset().

    Quindi:

    Codice PHP:
    $id = (isset($_GET['id']))
    ?

    Oppure:

    Codice PHP:
    $id = (isset($_SESSION['id']))
    ?


    Codice PHP:

    if(!isset($_SESSION['id'])) {

    $id = $_GET['id'];

    ....

    } else {

    die(
    'Errore!');

    }
    Ultima modifica di alemoppo : 22-05-2011 alle ore 14.25.53 Motivo: up
    Imparare A Programmare E' Il Mio Obiettivo!!!

  4. #4
    L'avatar di alemoppo
    alemoppo non è connesso Staff AV
    Data registrazione
    24-08-2008
    Residenza
    PU / BO
    Messaggi
    22,683

    Predefinito

    Così:
    Codice PHP:
    if(!isset($_GET['id'])) //se non esiste $_GET['id'], termino con un errore.
    die('Errore!');
    Si non fa una pecca il ragionamento, ma in termine di sicurezza è scarso come risultato, funzionante, ma da ottimizzare C=
    Perché non è sicura?


    Il fatto che la pagina linkata dalla email non esista, significa (ovviamente) che qui:

    Codice:
    "<a href=\"http://MIOSITOWEB/conferma_registrazione.php" . 
      "?id=$msgid\">
    C'è qualcosa di errato. Puoi dirmi che link scrive l'email che arriva? (ovviamente, non ho bisogno del parametro id: voglio solo verificare che la pagina non esista).

    Ciao!

Regole di scrittura

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