Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1

    Email di conferma per attivazione utente

    sto ultimando la registrazione utenti per il mio sito... e ora vorrei inserire anche la possibilità di controllare se la mail messa dall'utente sia effettivamente la sua mettendo appunto la conferma dell'email, come posso fare?
    se volete posto il codice php della registrazione dell'utente. grazie per l'aiuto ragazzi

  2. #2
    Moderatore di PHP L'avatar di Alhazred
    Registrato dal
    Oct 2003
    Messaggi
    12,503
    Quando un utente si registra devi generare un codice univoco e salvarlo nel db associandolo all'utente appena registrato, oltre a questo, nella tabella degli utenti metti un campo da chiamare ad esempio "attivato" in cui di default ci metti 0 che vuol dire no, quando l'utente avrà confermato la registrazione lo cambierai in 1 che vuol dire si.

    Alla fine della registrazione mandi all'utente un'email con un link che punta allo script di conferma, al link appendi come parametro il codice, sarà una cosa così
    http://www.sito.it/conferma.php?cod=jhfjkdshf89s6fds90

    Lo script non farà altro che prendere tale codice, verificare se c'è nella tabella degli utenti e in corrispondenza dell'utente associato modifichi il campo "attivato".

    Quando un utente prova a fare il login dovrai verificare, oltre a username e password, che tale utente abbia il campo "attivato" pari a 1.

  3. #3
    ho fatto tutto quanto ma mi pare che manca qualcosa a parte quello per accedere al sito, ti posto tutto il codice

    qui è dove si registra

    <?php
    include 'error_definition.php';
    ?>


    <form action="register.php" method="POST">
    username:<br>
    <input type="text" name="username" maxlength="20"><br><br>
    email:<br>
    <input type="text" name="email" maxlength="60"><br><br>
    password:<br>
    <input type="password" name="password" maxlength="20"><br><br>
    ripeti password:<br>
    <input type="password" name="password2" maxlength="20"><br><br>
    <input type="submit" value="registrati">
    </form>

    questa è tutto il corpo dello script

    <?php

    class NewUser
    {
    public $conn;

    public function AddUser()
    {
    $this->ErrorReport();
    }

    protected function DbConnect()
    {
    include "db_config.php";

    $this->conn = mysql_connect($host,$user,$password) OR die("Impossibile connettersi al database");
    mysql_select_db($db, $this->conn);
    }

    protected function IsEmptyField()
    {
    if(empty($_POST['username']) OR empty($_POST['email']) OR empty($_POST['password']))
    {
    return TRUE;
    }
    else
    {
    return FALSE;
    }
    }

    protected function VerifyPassword()
    {
    if($_POST['password'] == $_POST['password2'])
    {
    return TRUE;
    }
    else
    {
    return FALSE;
    }
    }

    protected function UsernameExists()
    {
    $this->DbConnect();
    $sql = "SELECT username FROM users WHERE username='$_POST[username]'";
    $res = mysql_query($sql, $this->conn);
    if($row = mysql_fetch_array($res))
    {
    mysql_close($this->conn);
    return TRUE;
    }
    else
    {
    mysql_close($this->conn);
    return FALSE;
    }
    }

    protected function EmailExists()
    {
    $this->DbConnect();
    $sql = "SELECT * FROM users WHERE email='$_POST[email]'";

    $res = mysql_query($sql, $this->conn);
    if($row = mysql_fetch_array($res))
    {
    mysql_close($this->conn);
    return TRUE;
    }
    else
    {
    mysql_close($this->conn);
    return FALSE;
    }
    }

    protected function VerifyEmail()
    {
    $pattern = "^([a-zA-Z0-9])+([a-zA-Z0-9]+[-_\.]?)*([a-zA-Z0-9])+(@)([a-zA-Z0-9])+([a-zA-Z0-9]+[-_\.]?)*([a-zA-Z0-9])+(\.[a-z]{2,4})$";

    if(ereg($pattern,$_POST['email']))
    {
    return TRUE;
    }
    else
    {
    return FALSE;
    }
    }

    public function ErrorResult($num)
    {
    header("Location: form.php?alert=" . $num);
    die;
    }

    protected function ErrorReport()
    {
    if($this->IsEmptyField())
    {
    $this->ErrorResult(1);
    }

    if(!$this->VerifyPassword())
    {
    $this->ErrorResult(2);
    }

    if($this->UsernameExists())
    {
    $this->ErrorResult(3);
    }

    if($this->EmailExists())
    {
    $this->ErrorResult(4);
    }
    if(!$this->VerifyEmail())
    {
    $this->ErrorResult(5);
    }

    $this->InsertNewUser();

    }

    protected function GetKey()
    {
    $car = "aAbBcCdDeEfFgGhHiIlLjJkKmMnNoOpPqQrRsStTuUvVwWxXy YzZ0123456789";
    $dim = 40;
    srand((double)microtime()*1000000);
    $string = '' ;

    for($inc=0; $inc<$dim; $inc++)
    {
    $rand = rand(0, strlen($car)-1);
    $scar = substr($car, $rand, 1);
    $string = $string . $scar;
    }

    return $string;
    }

    protected function SendUserMail($key)
    {
    $content = "Benvenuto $_POST[username],\r\n";
    $content .= "per confermare la tua iscrizione devi cliccare sul seguente link:\r\n\r\n";
    $content .= "http://www.itworldlive.it/prova/verify_user.php?key=" . $key;

    mail($_POST['email'], "Iscrizione al sito...", $content, "From: iscrizione a World Live<miomail@me.com>");

    return;
    }

    protected function InsertNewUser()
    {
    $password = md5($_POST['password']);
    $key_control = $this->GetKey();

    $sql = "INSERT INTO users (username,email,password,key_control) VALUES ('$_POST[username]','$_POST[email]','$password','$key_control')";

    $this->DbConnect();

    mysql_query($sql,$this->conn);

    mysql_close($this->conn);

    $this->SendUserMail($key_control);
    }

    public function VerifyUser()
    {
    $sql = "SELECT id FROM users WHERE key_control='$_GET[key]'";
    $this->DbConnect();
    $res = mysql_query($sql,$this->conn);

    if($row = mysql_fetch_array($res))
    {
    $query = "UPDATE users SET ver=1,key_control='0' WHERE id='$row[id]'";
    mysql_query($query,$this->conn);
    mysql_close($this->conn);
    echo "Il tuo account è ora attivato!";
    }
    else
    {
    echo "Impossibile verificare l'account!";
    }
    }
    }

    ?>

    quando clicca il link per attivare il suo account va su questa pagina

    <?php

    include 'newuser.class.php';

    $newuser = new NewUser();
    $newuser->AddUser();

    echo "inserimento avvenuto con successo<br>Un email é stato inviato per confermare l'attivazione del tuo account";

    ?>

    questo per la verifica tramite email

    <?php

    include 'newuser.class.php';

    $newuser = new NewUser();
    $newuser->VerifyUser();

    ?>

    grazie mille per l'aiuto

  4. #4
    appena mi dice il tuo account è ora attivo dopo che aggiorno mi da anche questo messaggio "Impossibile verificare l'account!" però sembra che funziona tutto, ma vorrei aggiungere un po di cose ad esempio: l’username non può contenere caratteri speciali, oppure la password deve essere al minimo di 6 caratteri, eccetera. Oppure, in caso di errore, oltre ad essere rimandati al form si potrebbe prevedere che i campi di questo form risultino compilati tranne quello dove si è prodotto l’errore.
    Ultima modifica di cardi_simo; 19-05-2014 a 17:56

  5. #5
    Utente di HTML.it L'avatar di mt19
    Registrato dal
    Jul 2011
    Messaggi
    180
    Non ho visto tutto il codice, tuttavia penso che prenda con un $_GET il codice, controlli in una tabella se corrisponde, se si verifica, elimina la riga e mette 1, quindi se aggiorni è ovvio che ti dica "impossibile", in quanto la casella è stata eliminata salvare spazio.
    Per la password basta che la tratti come stringa (http://www.html.it/pag/16690/le-funz...le-stringhe/):

    Codice PHP:
    if(strlen($password)>AND strlen($password)<30 
    Così metti che sia maggiore di 6 ma minore di 30

    Per username senza caratteri speciali ti rimando a qua: http://www.giorgiotave.it/forum/php-...accentate.html


    Per l'ultima richiesta basta che metti negli input una cosa del genere:
    Codice PHP:
    value="<?php $_GET['nome_campo'?>"
    e nella pagina di controllo metti che se c'è un'errore ti rimanda alla pagina con il form ma con tutti i $_GET

  6. #6
    La tabella è fatta così

    CREATE TABLE IF NOT EXISTS `users` (
    `id` int(4) unsigned NOT NULL AUTO_INCREMENT,
    `username` varchar(20) NOT NULL,
    `email` varchar(60) NOT NULL,
    `password` varchar(50) NOT NULL,
    `key_control` varchar(50) NOT NULL,
    `ver` int(1) NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

    fino qui tutto apposto, comunque non ho capito dove devo mettere la stringa della password fino a 6 caratteri e il "nome_campo"
    Ultima modifica di cardi_simo; 19-05-2014 a 20:45

  7. #7
    ah ragazzi scusate mi sono dimenticato 4 cose
    1) quando mi registro mi esce questo "Un email é stato inviato per confermare l'attivazione del tuo account" su é penso che ci sarà l'indirizzo email dell'utente
    2) dopo che è entrato nel link di conferma vorrei che lo porta nella home del sito
    3) non capisco perchè i messaggi me lo mette nella posta indesiderata
    4) se per caso l'utente non attiva il suo account si può cancellare automaticamente senza che lo devo cancellare io?
    grazie mille ragazzi per l'aiuto

  8. #8
    Utente di HTML.it L'avatar di mt19
    Registrato dal
    Jul 2011
    Messaggi
    180
    Scusa la mia domanda "cattiva", ma da quanto studi PHP, e soprattutto prima di postare hai letto la guida di base del PHP e la guida tra PHP e MySQL?

    Comunque tu hai un form:

    codice HTML:
    <form action="register.php" method="POST">
    username:<br>
    <input type="text" name="username" maxlength="20"><br><br>
    email:<br>
    <input type="text" name="email" maxlength="60"><br><br>
    password:<br>
    <input type="password" name="password" maxlength="20"><br><br>
    ripeti password:<br>
    <input type="password" name="password2" maxlength="20"><br><br>
    <input type="submit" value="registrati">
    </form>
    come penso saprai, se nel campo input metti value è come se fosse già completata, mi spiego con un esempio:

    codice HTML:
    <input type="text" name="email" maxlength="60" value="email.test@gmail.com">
    Quando apri la pagina il field email sarà già precompletato con la email email.test[at]gmail.com.
    Usando questa tecnica, se al posto che la mail metti:
    Codice PHP:
    <?php $_GET['email'?>
    vuol dire che con un $_GET in alto avrai la mail (per sapere di $_GET: http://www.html.it/pag/16695/le-variabili-get-e-post/)
    Con questo metodo puoi automaticamente completare i campi in caso di errore. Tuttavia è vivamente sconsigliato passare la password con un $_GET in quanto è tranquillamente visibile. Per questo motivo o usi un $_POST oppure usi dei cookies/session.
    In ogni caso, per questioni di sicurezza, consiglio vivissimamente di usare un metodo di criptaggio a doppia via (che con una chiave si possa sia criptare, che decriptare, a differenza di md5 e hsa1 che è solo crypt ma non decrypt). Per criptare la password ti consiglio:
    http://www.donatantonio.net/blog/tag/blowfish-php/
    Attualmente blowish è uno dei metodi più sicuri, se non il più sicuro.


    Dal form mandi i vari campi con un $_POST alla pagina register.php, quindi in register.php avverranno tutti i controlli, compreso quello della password.
    Quindi devi mettere la password in una variabile (nel mio esempio $password) e fai un if per verificare le condizioni che vuoi:

    Codice PHP:
    if (strlen($password) > 6){} 
    Così dici:
    SE (LUNGHEZZA DI ($PASSWORD) > 6)
    ALLORA ESEGUI...



    Per rispondere al secondo messaggio:
    1) semplicemente è sbagliata la codifica, quello penso che sia una è, quindi sostituiscila con questo codice: &egrave; N.B occhio che è HTML e non php!!!

    2) usa questo codice:
    Codice PHP:
    <? header("location: http://.........."); ?>
    3) Perchè o usi un dominio con indirizzo palesemente fasullo et simili,o perchè l'IP da dove invii le mail è stato bannato dal tuo client di posta per spam oppure perchè invii una mail non in italiano corretto, con troppi link o comunque strana

    4) Certo che puoi, ti do due modi, tuttavia prima devo fare un appunto: tu hai il codice, ma non una data in cui il codice è stato generato, quindi non sai se un utente è stato generato 5 minuti fa oppure 1 anno e mezzo fa, quindi ti consiglio o di fare un campo con solo la data, oppure dove c'è il codice metti un carattere che non può essere prodotto, tipo una virgola (,) e dopo al codice metti ,data
    ES: A023RDWQ23F23F,19/05/2014
    In questo modo con delle funzioni per agire sulle stringe (explode è la più semplice, http://www.html.it/pag/16690/le-funz...e-le-stringhe/) puoi avere sia il codice, sia la data ma senza creare una colonna in più che è solo spazio inutile (per un sito da 10 utenti non cambia nulla, ma nell'otica di avere un sito come questo, con migliaia di utenti, tutto fa brodo )
    Ora, partendo dal presupposto che abbiamo anche la data, vediamo i metodi:
    a) con dei cron job, ossia esegue un determinato codice ogni tot, tutto in automatico
    b) (quella più semplice) Crei una pagina in PHP che ha solo quella funzione, metti che se sono passati più di 5 giorni (cerca su google per fare calcoli sul date in PHP) allora la riga viene cancellata (e così cancelli tutte le info di un utente), altrimenti non fai nulla. In questo modo se un utente è appena stato creato non viene cancellato, ma rimane lì, mentre se è stato creato un anno e mezzo fa allora viene cancellato.
    Io ti ho detto di mettere il codice in una pagina a se, ma capisco bene che può essere una rottura ricordarsi di aprirlo anche solo una volta a settimana, per questo motivo il mio consiglio è di metterlo in una pagina che se visiti quasi tutti i giorni, per esempio se hai un'area amministrativa, lo puoi mettere nella homepage dell'aera amministrativa, così tutte le volte che ti logghi il codice viene eseguito. Ti sconsiglio comunque di metterlo in una pagina del sito a cui tutti possono accedere, per esempio la homepage del sito, in quanto se hai 100 visualizzazioni di pagina al giorno il codice viene fatto 100 volte in un giorno, se ne hai 1000, 1000 volte, se ne 100000, 100000 volte, che possono sembrare tante, ed effettivamente lo sono, ma molti siti raggiungono questi livelli. Farlo una volta al giorno basta e avanza, quindi piazzala in una pagina nè troppo sperduta nè troppo visitata. Altrimenti nel pannello di admin metti una parte di sola manutenzione con tutti i controlli di questo genere...

  9. #9
    nella password vorrei mettere minimo inserire 6 caratteri, poi il massimo dei caratteri lo posso mettere con maxlength="20"

    nella terza come posso fare per evitare di essere bannato. L'indirizzo url non è fasullo è di aruba quindi non penso che sarà quello, cosa mi consigli di fare?

    nella 4 domanda non ho capito se fare un timestamp in php o in javascript?

    la base del php lo sto studiando piano piano da poco ho iniziato poi con lo stage in mezzo alle scatole non riesco a studiarmelo benissimo, non so come ringraziarti

    nel sito ho un pannello di amministrazione, però posso vedere le iscrizioni, commenti e le segnalazioni

  10. #10
    Utente di HTML.it L'avatar di mt19
    Registrato dal
    Jul 2011
    Messaggi
    180
    La differenza è che maxlenght è un controllo che fai con HTML, quindi posso tranquillamente aprire la modalità programmatore (ispeziona elemento in chrome) e togliere maxlenght dal form. In questo modo posso mettere una password di 200 caratteri e inviarla al PHP senza che tu te ne accorga. Il PHP invece non posso modificarlo perchè è lato server, quindi non posso "fregarti".

    Intanto la lista nera delle email dipende da client a client: gmail potrebbe bannarlo mentre yahoo no e hotmail potrebbe bannarti una mail si e una no. L'unica cosa da fare è controllare che l'email venga inviata in italiano o inglese, senza caratteri strani, senza troppi link (ci sono algoritmi che verificano tot parole per ogni link). Potrebbe essere stato bannato il server in quanto è condiviso con altri siti, i quali potrebbero aver spammato... Se è così l'unica cosa è chiamare aruba e provare ad esporre il problema.

    Fallo con PHP che mi sembra decisamente più comodo, così eviti di intrecciare i due linguaggi inutilmente

    Ti posso dare una seconda soluzione:
    quando verifichi il codice verifichi anche la data, così se un utente ha attivato il codice dopo troppi giorni allora non viene attivato, anzi fai una query che elimini la persona.
    Poi metti nella pagina di admin lo script di pulizia per quelli che non hanno nemmeno attivato l'account dopo troppo tempo, così sarai sicura che gli utenti non potranno attivare l'account superata la soglia e anche se fai andare lo script di pulizia (che toglie gli utenti non confermati) una volta a settimana non succede nulla di male.

    Ah, capisco, come al solito il problema è sempre troppo poco. Visto che sei agli inizi allora ti consigli di prendere due accorgimenti:
    1) assicurati che le password siano criptate con hsa1 o altri metodi di crypt
    2) assicurati di essere immune almeno alle SQL injection (http://www.html.it/articoli/protegge...l-injection-1/

    Inoltre ti dico che per essere un bravo programmatore devi saper prevedere tutto quello che gli utenti faranno:
    quello della maxlenght che ti ho detto è una cavolata, in quanto alla fine al 99% nessuno andrà a modificare il codice, ma è comunque una falla nel sistema. Se io accedo e voglio mettere la mia password lunga 30 caratteri posso tranquillamente farlo...

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 © 2025 vBulletin Solutions, Inc. All rights reserved.