Seite 1 von 4 1234 LetzteLetzte
Ergebnis 1 bis 10 von 36

Thema: double opt in - Vefahren bei Registriervorgang

  1. #1
    Fortgeschrittene/r
    Registriert seit
    25.06.2016
    Beiträge
    178
    Danke
    6
    Bekam 12 mal "Danke" in 12 Postings

    Standard double opt in - Vefahren bei Registriervorgang

    Hey zusammen,

    ich möchte das double opt in verfahren anwenden um wirklich sicher zu gehen das die email richtig ist die eingegeben worden ist und kein fake.
    Nun wie kann man sowas machen ?
    Ich habe schon danach gesucht aber nicht viel gefunden.

    Gruß,
    Stef
    Achtung: Dies ist ein alter Thread im HTML und Webmaster Forum
    Diese Diskussion ist älter als 90 Tage. Die darin enthaltenen Informationen sind möglicherweise nicht mehr aktuell. Erstelle bitte zu deiner Frage ein neues Thema im Forum !!!!!

  2. #2
    Moderator Avatar von Arne Drews
    Registriert seit
    20.01.2016
    Ort
    Friedrichstadt, NF
    Beiträge
    1.236
    Danke
    21
    Bekam 120 mal "Danke" in 119 Postings

    Standard AW: double opt in - Vefahren bei Registriervorgang

    Hallo,

    Beim Registrieren einen Hashwert/-ID bilden und zu der E-Mail Adresse speichern.
    Dann einen Link mit diesem Hashwert als Parameter und der E-Mail Adresse per Mail schicken.

    User klickt auf den Link ( oder kopiert den in die Adresszeile des Browsers ) und Du musst dann nur noch in der Datenbank schauen, ob E-Mail und Hashwert zusammenpassen.

    Gruß Arne

  3. #3
    Fortgeschrittene/r
    Themenstarter

    Registriert seit
    25.06.2016
    Beiträge
    178
    Danke
    6
    Bekam 12 mal "Danke" in 12 Postings

    Standard AW: double opt in - Vefahren bei Registriervorgang

    Hey,

    ich habe nun mal die Datenbankverbindung aufgebaut und die ganzen Daten speichern lassen.

    Mein aktueller Stand:
    PHP-Code:
    <?php
    $vorname 
    $nachname $email $tag $monat $jahr $benutzername $password $password_gehahst  $password_wiederholung  null// alle vars auf null setzen

    $fehler = array();


    if(isset(
    $_POST['submitted']))
    {
        
    $vorname trim($_POST['vorname']);
        
    $nachname trim($_POST['nachname']);
        
    $email trim($_POST['email']);
        
    //Geburtsdatum
        
        
    $tag $_POST['tage'];
        
    $monat $_POST['monate'];
        
    $jahr $_POST['jahre'];

        

        
    //Benutzername
        
    $benutzername trim($_POST['benutzername']);

        
    //Password
        
    $password $_POST['password'];
        
    $password_wiederholung $_POST['password_wiederholung'];

        
    $password_gehahst password_hash($password_gehahstPASSWORD_DEFAULT);

        
    /***********************Die ganzen errors**************************/
        
    if(empty($vorname)){
        
    $fehler[] = '<p class="fehler">Bitte geben sie ihren Vornamen an!</p>';
        }
        if(empty(
    $nachname)){
        
    $fehler[] = '<p class="fehler">Bitte geben sie ihren Nachnamen an!</p>';
        }
        if(empty(
    $email)){
        
    $fehler[] = '<p class="fehler">Bitte geben sie ihre E-Mail-Adresse an!</p>';
        } else if (
    filter_var($email FILTER_VALIDATE_EMAIL) === false){
            
    $fehler[] = '<p class="fehler">Bitte geben sie eine gültige E-Mail-Adresse an!</p>';
        }
        if(empty(
    $tag) or empty($monat) or empty($jahr)){
        
    $fehler[] = '<p class="fehler">Bitte geben sie ihr Geburtsdatum an!</p>';
        }
        if(empty(
    $benutzername)){
        
    $fehler[] = '<p class="fehler">Bitte geben sie ihren Benutzernamen an!</p>';
        }
        if(empty(
    $password)){
        
    $fehler[] = '<p class="fehler">Bitte geben sie ihr Password an!</p>';
        }
        if(empty(
    $password_wiederholung)){
        
    $fehler[] = '<p class="fehler">Bitte wiederholen sie ihr Passwords!</p>';
        } else if(
    $password_wiederholung !== $password){
            
    $fehler[] = '<p class="fehler">Das wiederholte Password stimmt nicht überein!</p>';
        }


    if(
    count($fehler) === ){

    $email_id uniqid();
    $bestaetigungslink 'http://apple231.bplaced.net/Registriervorgang/registration_weiterleitung.php?' $email_id;

     try{
         
    $pdo = new PDO('mysql:host=localhost; 
                         dbname=Registriervorgang'
    //der Host und dbname
                         
    'root'// User-Name
                         
    ''//Password
              
    array(
                    
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,     
                    
    // gibt an, dass man die Rückgabe eines Datensatzes von Methoden als Objekt erhaltet
                    
    PDO::ATTR_EMULATE_PREPARES => false,                
                    
    // sagt, dass man nicht nur emulieren wollen, sondern PreparedStatements nutzen wollen
                    
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION         
                    
    // PDO veranlassen , Exceptions zu werfen, die man abfangt und darauf reagiert
                  

                );

                         

     } catch(
    Exception $e)
     {
         exit(
    'Fehler beim verbinden:' $e->getMessage());
     }

     
    $statement $pdo->prepare("INSERT INTO Registrierdaten(vorname,nachname,email,tag,monat,jahr,benutzername,password,hashid) 
      VALUES(:vorname,:nachname,:email,:tag,:monat,:jahr,:benutzername,:password,:hashid)" 
    );

     
    $result $statement->execute(
      array(
        
    ':vorname' => $vorname,
        
    ':nachname'  => $nachname,
        
    ':email' => $email,
        
    ':tag' => $tag,
        
    ':monat' => $monat,
        
    ':jahr' => $jahr,
        
    ':benutzername' => $benutzername,
        
    ':password' => $password_gehahst,
        
    ':hashid' => $email_id,
        )
      );

     if(!
    $result){
      
    var_dump($statement->errorInfo());
     }
        }


    ?>
    Da habe ich nun eine id die sich immer ändert. Und diese wird dann der email hinzugefügt als url parameter. Nun muss ich ja noch die hashid die bei der Regestration abgespeichert wird überprüfen ob email und hasid zusammenpassen.
    Aber wie mache ich es jetzt ? Ich habe gedacht eine weiteres statement die hashid und email selektieren, um dann zu überprüfen ob die zusammenpassen.

    Komisch die hash id bleibt immer gleich... Soll doch nicht ??? Mit uniqid(); erstellt man doch unterschiedliche ids ?? Mit hash(); weiß ich nicht wie ichs machen soll. Was soll man denn da hashen lassen ? Weil es gibt keine hash function die ohne werte einen hash-wert erstellt glaube ich. Habe bisher keine gefunden.

    Ich möchte, dass wenn jemand sich registriert noch nicht sich einloggen kann. Erst wenn dieser die Bestätigungsmail geklickt hat.
    Wenn ich nun aber die hashid schon in db speichere ist es doch unnötig des zu vergleichen. Weil der User eh sich einloggen kann.

    Aber wie soll ich denn rausbekommen ob der User den Link geklickt hat ?

    Gruß,
    Stef
    Geändert von Stef (06.09.2016 um 21:00 Uhr)

  4. #4
    Moderator Avatar von Arne Drews
    Registriert seit
    20.01.2016
    Ort
    Friedrichstadt, NF
    Beiträge
    1.236
    Danke
    21
    Bekam 120 mal "Danke" in 119 Postings

    Standard AW: double opt in - Vefahren bei Registriervorgang

    Hallo,

    Eine einfache Möglichkeit von vielen ist, einen Hash aus der der E-Mail und dem Passwort zu bilden, bspw. auf diese Weise:
    PHP-Code:
    $sEmail $_POST['email']; // E-Mail vom User eingegeben
    $sPasswordHash password_hash$_POST['password'] ); // Hash des Passwortes vom User eingeben
    $sHashId hash'sha256'implode('$', [$sEmail$sPasswordHash]) );

    $sDoubleOptInLink 'http://apple231.bplaced.net/Registriervorgang/registration_weiterleitung.php?' $sHashId
    Diesen Link versendest Du dann per Mail an die eingegebene E-Mail Adresse. Zusätzlich speicherst Du den Hashwert in ein weiteres Feld bei dem User.
    Auf der Zielseite ( bei Dir: registration_weiterleitung.php ) kannst Du das bspw. so abfangen:
    PHP-Code:
    if ( !empty($_SERVER['QUERY_STRING']) ) {

        
    $aData explode'$'$_SERVER['QUERY_STRING'] );


    In $aData hast Du jetzt ein Array mit der E-Mail und dem Hashwert zur Verification.
    Jetzt musst Du nur noch schauen, ob es einen Eintrag in der DB gibt, der mit der E-Mail Adresse und dem Hashwert übereinstimmt!

    Das ist wie gesagt nur eine von vielen Möglichkeiten und aufgrund der Überschaubarkeit auch ohne Datenfilterung etc.

    Gruß Arne

  5. #5
    Fortgeschrittene/r
    Themenstarter

    Registriert seit
    25.06.2016
    Beiträge
    178
    Danke
    6
    Bekam 12 mal "Danke" in 12 Postings

    Standard AW: double opt in - Vefahren bei Registriervorgang

    Hey,

    Mein aktueller Stand sieht wie folgt aus:
    PHP-Code:
    <?php
    session_start
    ();

    $fehler =  array();

    if(!isset(
    $_SESSION['benutzername']))
    {
        die (
    "Bitte erst <a href='registrieren.php'>hier</a> regestrieren! ");
        exit;

        
    $user =  $_SESSION['benutzername'];


     if ( !empty(
    $_SERVER['QUERY_STRING']) ) {
            
    $check explode'$'$_SERVER['QUERY_STRING'] );
    try{
        
    $pdo = new PDO('mysql:host=localhost; 
                        dbname=apple231'
    //der Host und dbname
                        
    '****'// User-Name
                        
    '***'//Password
              
    array(
                    
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,     
                    
    // gibt an, dass man die Rückgabe eines Datensatzes von Methoden als Objekt erhaltet
                    
    PDO::ATTR_EMULATE_PREPARES => false,                
                    
    // sagt, dass man nicht nur emulieren wollen, sondern PreparedStatements nutzen wollen
                    
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION         
                    
    // PDO veranlassen , Exceptions zu werfen, die man abfangt und darauf reagiert
                  

                );

                        

     } catch(
    Exception $e)
     {
        exit(
    'Fehler beim verbinden:' $e->getMessage());
     }

        
    $statement $pdo->prepare("SELECT hashid FROM Registrierdaten WHERE benutzername = ".$user."");
        
    $result $statement->execute();

        

            if(
    $result ===  $check)
            {
                
    $antwort "Dankeschön. Hier gehts zu ihrem <a href='#'Profil</a>.";  
            } else if (
    $result !==  $check){
                 
    $fehler[] = "Fehlerhafte Registration. Bitte registrieren sie sich  nochmal!<br><a href='registrieren.php'>Hier  registrieren</a>";
            } 
        } else  if ( empty(
    $_SERVER['QUERY_STRING']) ) {
                 
    $fehler[] = "Kein Wert vorhanden. Bitte registrieren sie sich  nochmal!<br><a href='registrieren.php'>Hier  registrieren</a>";
            }
        
                        
    ?>
    PHP wirft mir dabei immer diese Exception :


    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'rere' in 'where clause'' in /users/apple231/www/Registriervorgang/registration_weiterleitung.php:38 Stack trace: #0 /users/apple231/www/Registriervorgang/registration_weiterleitung.php(3: PDO->prepare('SELECT hashid F...') #1 {main} thrown in /users/apple231/www/Registriervorgang/registration_weiterleitung.php on line 38



    Das heißt, das die spalte nicht gefunden worden ist. Ich sag selektiere/wähle die spalte hashid aus wo benutzername ist $user. ($user ist der Session Benutzername dieser wiederum ist der Benutzername der eingegeben worden ist.) Aber wie kann es sein ?

    Und wie ich es nun vergleichen soll. Hab ich nochnicht gemacht.
    Sollte man da mittels fetch die einzelne Spalte durchgehen und dann in dieser bedingung die if statements reinmachen ?

    Gruß,
    Stef
    Geändert von Stef (07.09.2016 um 19:44 Uhr)

  6. #6
    Moderator Avatar von Arne Drews
    Registriert seit
    20.01.2016
    Ort
    Friedrichstadt, NF
    Beiträge
    1.236
    Danke
    21
    Bekam 120 mal "Danke" in 119 Postings

    Standard AW: double opt in - Vefahren bei Registriervorgang

    Lass Dir mal Dein SQL-Statement ausgeben, Du hast einen Fehler darin, das ist alles.

  7. #7
    Fortgeschrittene/r
    Themenstarter

    Registriert seit
    25.06.2016
    Beiträge
    178
    Danke
    6
    Bekam 12 mal "Danke" in 12 Postings

    Standard AW: double opt in - Vefahren bei Registriervorgang

    Hey,

    ich glaube den Fehler gefunden zu haben in sql statement es waren die anführungszeichen..

    Nun das nächste Problem. Es kommt zwar kein error mehr aber es wird nichts ausgegeben.

    Die Ausgabe mache ich so:

    PHP-Code:
      <?php 
                            
    if(isset($antwort) && count($fehler) === 0)
                            {
                                echo 
    $antwort
                            } else if (isset(
    $fehler) && count($fehler) > 0){
                                
    implode('<br>',$fehler) ;
                            }
                        
    ?>
    Warum gibt der da nix aus ?

    Gruß,
    Stef

  8. #8
    Moderator Avatar von Arne Drews
    Registriert seit
    20.01.2016
    Ort
    Friedrichstadt, NF
    Beiträge
    1.236
    Danke
    21
    Bekam 120 mal "Danke" in 119 Postings

    Standard AW: double opt in - Vefahren bei Registriervorgang

    Mir scheint, Du weißt nicht so recht, was Du tust, kann das sein?

    $check ist bei Dir ein Array
    $result ist eine ResourceId oder false
    Du vergleichst beide typsicher und erwartest was?

    In dem Fall sollte zwar die else if Bedingung greifen und $fehler zumindest dort befüllt werden.
    Jetzt musst Du debuggen. Lass Dir die Variablen mit var_dump() an den entsprechenden Stellen ausgeben und schau, ob darin das ist, was Du erwartest.

    Ich könnte mir vorstellen, dass die Query keine Datensätze oder sogar einen false liefert.
    Evtl. passiert die Ausgabe auch an der falschen Stelle?

    Sieht insgesamt noch sehr abenteuerlich aus...

  9. #9
    Fortgeschrittene/r
    Themenstarter

    Registriert seit
    25.06.2016
    Beiträge
    178
    Danke
    6
    Bekam 12 mal "Danke" in 12 Postings

    Standard AW: double opt in - Vefahren bei Registriervorgang

    Hey,

    so ne richtige Ahnung habe ich nicht. Hab ich ja auch gesagt weil ichs noch nie gemacht habe und nicht weiß wies geht.

    Aber das ist ja klar wenn ich mit === auf den Typ prüfe das da eigentlich nichts ausgegeben wird. Da das eine ein array und das andere kein array ist.

    Habe nun die 3 vars ($statement, $check, $result) ausgeben lassen. Das kommt raus:

    statement: object(PDOStatement)#2 (1) { ["queryString"]=> string(73) "SELECT hashid FROM Registrierdaten WHERE benutzername = "Stef Hunnington"" }
    result: bool(true)
    check:array(1) { [0]=> string(64) "a1d22d92f96a0bb64032aaf25ebb9b68b6b98122e755fa740 6e03a5f0a73fd1d" }

    Jetzt fehlt da noch die hashid von Datenbank..Eine typsichere vergleichung ist doch da sinnvoll. Wie könnte man es dann sonst machen ?

    Abenteuerlich ?

    Stef
    Geändert von Stef (08.09.2016 um 16:38 Uhr)

  10. #10
    Moderator Avatar von Arne Drews
    Registriert seit
    20.01.2016
    Ort
    Friedrichstadt, NF
    Beiträge
    1.236
    Danke
    21
    Bekam 120 mal "Danke" in 119 Postings

    Standard AW: double opt in - Vefahren bei Registriervorgang

    Hallo,

    Die Ausgabe der Query kann nicht aus dem von Dir geposteten Script stammen, denn
    1. fehlen dort die Quotes komplett
    2. nutzt MySQL SingleQuotes für VARCHAR- und TEXT-Datentypen

    Desweiteren:
    Mit $result kannst Du nur prüfen, ob die Abfrage erfolgreich war, hast aber kein Ergebnis.
    Du vergleichst also in dem Moment typsicher einen Boolean ( $result ) mit einem Array ( $check ), da kann nur false bei rauskommen!

    Warum die Fehler nicht ausgegeben werden lassen wir mal für den Moment dahingestellt.
    Wichtig ist erstmal, was für eine Logik Du verfolgst, bzw. verfolgt werden muss!

    1. Wurde die Query korrekt verarbeitet ( $result )?
    2. Gibt es einen resultierenden Datensatz aus der Query ( fehlt bei Dir! )
    3. Ist die resultierende HashId aus der Query gleich der aus $check?

    Diese drei Fälle musst Du mindestens verarbeiten, um dem Ziel näher zu kommen.

    Weiterhin nutzt Du $check anders, wie ich.
    Wenn Du den Link so versendest, wie ich, steht in $_SERVER['QUERY_STRING'] etwas in der Form:
    Code:
    test@example.com$a1d22d92f96a0bb64032aaf25ebb9b68b6b98122e755fa7406e03a5f0a73fd1d
    Wenn Du dann per explode beim $ trennst, sollte Dein Array $check so aussehen:
    Code:
    Array (
        [0] => test@example.com
        [1] => a1d22d92f96a0bb64032aaf25ebb9b68b6b98122e755fa7406e03a5f0a73fd1d
    )
    Bei Dir hat das Array allerdings nur ein Element, was mich vermuten lässt, dass Du die Mail mit dem $-Zeichen nicht vorangestellt hast.
    Die Abfrage innerhalb der Datenbank würde ich allerdings auf die E-Mail beziehen und nicht auf den Benutzernamen.


    EDIT ( Code grob überarbeitet ):
    Hier mal eine Variante, die zumindest von der Logik passen sollte, allerdings ungetestet offline im Editor angepasst!
    PHP-Code:
    <?php
    session_start
    ();


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

        
    header 'location: ' __DIR__ '/registrieren.php' );
        exit;




    $userEmail $_SESSION['benutzeremail'];
    $check = ( !empty($_SERVER['QUERY_STRING']) )? explode'$'$_SERVER['QUERY_STRING'] ): null;


    try {

        
    $pdo = new PDO('mysql:host=localhost; 
                dbname=apple231'
    //der Host und dbname
                
    '****'// User-Name
                
    '***'//Password
                
    array(
                    
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ,     
                    
    // gibt an, dass man die Rückgabe eines Datensatzes von Methoden als Objekt erhaltet
                    
    PDO::ATTR_EMULATE_PREPARES => false,                
                    
    // sagt, dass man nicht nur emulieren wollen, sondern PreparedStatements nutzen wollen
                    
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION         
                    
    // PDO veranlassen , Exceptions zu werfen, die man abfangt und darauf reagiert
                

            );

                        

     } catch( 
    PDOException $e ) {

        exit( 
    'Fehler beim verbinden:' $e->getMessage() );
     
     }


    $statement $pdo->prepare("SELECT hashid FROM Registrierdaten WHERE benutzeremail = ?" );
    $statement->bindParam0$userEmailPDO::PARAM_STR );
    $result $statement->execute();


    $fehler = array();

        
    if ( !
    $result ) {

        
    $fehler[] = 'Fehler in der Datenbankabfrage!';

    } else {

        if ( !
    $dsRow $statement->fetch() ) {

            
    $fehler[] = 'E-Mail Adresse in Datenbank nicht gefunden!';

        } else {

            if ( 
    $dsRow->hashid != $check[1] ) {

                
    $fehler[] = 'Keine Übereinstimmung!';

            }

        }

    }



    if ( 
    count($fehler) > ) {

        echo 
    $fehler;

    }
    Die IF-Olympiade bekommt man sicher auch noch besser hin, aber hier soll erstmal nur die Logik aufzeigen, die Du verfolgen musst.

    Gruß Arne
    Geändert von Arne Drews (08.09.2016 um 17:16 Uhr)

Ähnliche Themen

  1. Spaltentyp von INT auf Double ändern?
    Von Darkxor im Forum Datenbank Forum - MySQL und andere Datenbanksoftware
    Antworten: 4
    Letzter Beitrag: 27.04.2009, 00:52
  2. operator= für double.operator= double
    Von The User im Forum Forum für alle anderen Programmiersprachen
    Antworten: 5
    Letzter Beitrag: 21.04.2008, 23:02
  3. Single Quotes oder Double? das ist hier die frage^^
    Von felixstoessel im Forum PHP Forum - Apache - CGI - Perl - JavaScript und Co.
    Antworten: 21
    Letzter Beitrag: 18.01.2008, 16:37
  4. Splinter Cell 4: Double Agent - Wie hackt man?
    Von Rotkäppchen im Forum Computer - Internet Forum
    Antworten: 15
    Letzter Beitrag: 06.11.2007, 09:19
  5. DVD Rohling Double Layer mit Light Scribe?
    Von PatrickPaulsen im Forum Computer - Internet Forum
    Antworten: 9
    Letzter Beitrag: 09.06.2005, 10:25

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •