Simon: EMAIL confirm

Hi,
hätte da eine Frage zu einem Hash für die Email Confirmation.
Ansich funktioniert das Script außer das der Hash in der Datenbank und der In der Email nicht übereinstimmen.

Kann mir vieleicht jemand sagen ob ich was falsch gemacht habe?

Hier mal ein Teil des Scripts:

//////////////////////////////////////////////////  
//////////////////////////////////////////////////  
  
$email_confirmed ="0";  
function refgen($length)  
{  
  list($msec,$sec)=explode(' ',microtime());  
  mt_srand((float) $sec + ((float) $msec * 100000));  
  return substr(md5(uniqid(mt_rand(),true)),0,$length);  
}  
$code = md5(refgen(16));  
  
///////////////////////////////////////////////////  
///////////////////////////////////////////////////  
  
  if  (!$returnedID &&!$error_msg && $_POST['submitted']) {  
  
  
  writeMemberSignup ($first_name, $last_name, $email, $password1, $email_confirmed, $code);  
  
  $_SESSION['name']='loggedIn';  
  
  header ('Location: a_sign_up.php');  
  
    exit();  
 }  
  
$my_email = "email";  
  
 $email_subject="Bestätige deine Registrierung!";  
 $email_body = "Danke für die Registrierung auf heimgeistig.at. Bitte klick auf den Link um deine Registrierung zu bestätigen:\n\n <a href=\"http://www.seiteblablabla/confirm_email.php?ref=$code\">Jetzt bestätigen!</a>\n Wenn der Link nicht funtkioniert kopier ihn einfach in deinen Webbroser und drücke Enter!";  
        mail ($email, $email_subject, $email_body, "From: ".$my_email);

MfG
Simon

  1. Kann mir vieleicht jemand sagen ob ich was falsch gemacht habe?

    da fehlt zwar die hälfte, aber ich vermute du generierst 2 hashes, einen verschickst du per mail den anderen speicherst du in die datenbank

    du solltest eigentlich einen generieren, in die datenbank speicher und dann sofort den selben wert als mail verschicken - wenn die e-mails später verschickt werden, verwende dazu daten aus der datenbank

    im übrigen, deine hash-funktion ist potentiell fehlerhaft, da sie keine eindeutigen werte generiert ;) - das ist zwar in einer sehr vernachlässigbaren dimension, aber ich wills nur gesagt haben

    1. da fehlt zwar die hälfte

      Hier mal das Gesamte Script:

      <?php  
      require_once ("includes/validation/validation_functions.php");  
      require_once ("includes/files/write_to_a_flat_file4.php");  
      require_once ("includes/sql/write_signup_db.php");  
      require_once ("includes/sql/email_exists_check_db.php");  
        
      session_start();  
        
        
      if (@$_POST['submitted']) {  
       $first_name = @$_POST['first_name'];  
        $last_name = @$_POST['last_name'];  
        $email = @$_POST['email'];  
        $password1 = @$_POST['password1'];  
       $password2 = @$_POST['password2'];  
        
       $error_msg=array();  
        
        
      $valid = verifyAlphaNum ($first_name);  
      if (!$valid){  
      $error_msg[]="Vorname darf nur Buchstaben, Zahlen, Leerzeichen, Bindestrische und ' enthalten.";  
      }  
        
      $valid = verifyAlphaNum ($last_name);  
      if (!$valid){  
      $error_msg[]="Nachname darf nur Buchstaben, Zahlen, Leerzeichen, Bindestrische und ' enthalten.";  
      }  
        
      $valid = verifyEmail ($email);  
      if (!$valid){  
      $error_msg[]="Email muss ein valides Format haben (z.B. john@yahoo.com).";  
      } else {  
        
       $returnedID = checkEmail($email);  
        
      }  
        
      if (((strlen($password1)) < 4) or ((strlen($password1))) > 9){  
      $error_msg[]="Passwort muss 4 bis 9 Zeichen enthalten.";  
      }  
        
      if ($password1 !== $password2) {  
      $error_msg[]="Beide Passwort-Felder müssen übereinstimmen. Bitte versuchen sie es noch einmal.";  
      }  
        
      $valid = verifyPassword ($password1);  
      if (!$valid){  
      $error_msg[]="Passwort darf nur Buchstaben und Zahlen enthalten.";  
      }  
        
      //////////////////////////////////////////////////  
      //////////////////////////////////////////////////  
        
      $email_confirmed ="0";  
      function refgen($length)  
      {  
        list($msec,$sec)=explode(' ',microtime());  
        mt_srand((float) $sec + ((float) $msec * 100000));  
        return substr(md5(uniqid(mt_rand(),true)),0,$length);  
      }  
      $code = md5(refgen(16));  
        
      ///////////////////////////////////////////////////  
      ///////////////////////////////////////////////////  
        
        if  (!$returnedID &&!$error_msg && $_POST['submitted']) {  
        
        
        writeMemberSignup ($first_name, $last_name, $email, $password1, $email_confirmed, $code);  
        
        $_SESSION['name']='loggedIn';  
        
        header ('Location: a_sign_up.php');  
        
          exit();  
       }  
        
      $my_email = "email";  
        
       $email_subject="Bestätige deine Registrierung!";  
       $email_body = "Danke für die Registrierung auf heimgeistig.at. Bitte klick auf den Link um deine Registrierung zu bestätigen:\n\n <a href=\"http://www.heimgeistig.at/confirm_email.php?ref=$code\">Jetzt bestätigen!</a>\n Wenn der Link nicht funtkioniert kopier ihn einfach in deinen Webbroser und drücke Enter!";  
              mail ($email, $email_subject, $email_body, "From: ".$my_email);  
        
      }  
      ?>
      

      im übrigen, deine hash-funktion ist potentiell fehlerhaft, da sie keine eindeutigen werte generiert ;) - das ist zwar in einer sehr vernachlässigbaren dimension, aber ich wills nur gesagt haben

      Kannst du vieleicht erklären wie ich es anders Lösen kann?

      MfG
      Simon

      1. dein zeug ist immer noch unvollständig - und beschränke dich bitte auf die relevanten teile

        der teil wo der hash in die datenbank geschrieben wird und der wo die nachricht generiert wird reicht ;)

        Kannst du vieleicht erklären wie ich es anders Lösen kann?

        sorge dafür, dass du einen eindeutigen wert erhälst - die primitive und äusserst ineffiziente möglichkeit ist, einfach zu prüfen ob der hash schon in der datenbank existiert oder nicht, wenn er schon drin ist: neu generieren

        zudem schaufelst du vorher zu viel mit zufallszahlen herum, das ist garnicht notwendig ;)

        uniqid
        siehe dazu die kommentare

        wie bereits erwähnt, die chance einer kolision auf deinen md5-hash ist verschwindend gering, aber es kann durchaus passieren - und diesen fall musst du abfangen indem du einfach prüfst, ob der hash schon mal so in der datenbank steht oder nicht (das ist zwar eine abfrage mehr, aber sicher ist sicher)

        1. Ok, werde dass dann ändern.
          Hätte da noch eine andere Frage: am was kann es liegen wenn es relativ lange dauert bis das Email ankommt??

          MfG
          Simon

          1. Hätte da noch eine andere Frage: am was kann es liegen wenn es relativ lange dauert bis das Email ankommt??

            daran, dass es dienstag ist :) halt, nein heute ist donnerstag

            prüfe wie lange das script zum generieren der mail braucht

            prüfe wann die nachricht abgeschickt wird

            prüfe deinen mailserver per hand und verschicke eine mail, schau was passiert - telnet und das smtp-protokoll werden deine freunde sein

            prüfe wann dein mailserver die mail bekommt (mail-header)

            und wann du tatsächlich wind bekommst - manche mailclients prüfen alle 20 sekunden, 5 minuten, 30 minuten usw ob neue mails da sind