• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Anfängerfrage: Wie erstellt man einen Token?

Backfighter

Neues Mitglied
Hallo :D

Ich versuche gerade eine Email bestätigung zu schreiben, mit der der Benutzer nach der Registrtion beweisen kann, dass seine Email tatsächlich existiert.
Deshalb habe ich mir überlegt in der Email einen Link anzubrigen z.B. :
HTML:
<a href="/AccAktivierung.php?token=hier sollte ein token stehen">Klicken sie hier!</a>
und dann in der AccAktivierung.php diesen token abzurufen, leider habe ich keine Ahnung wie man einen token in php setzt :?

Danke schonmal in Vorraus :D

mfG Backfighter
 
Werbung:
Sobald sich ein User registriert, speicherst du seine Daten (Username, Passwort...) in der Datenbank ab. Zusätzlich in einer weiteren Spalte kannst du eine durch Zufall generierte Zeichenkette (oder einem nach MD5 gehashten Wert) speichern. Diese Zeichenkette (od. MD5-Hash) hängst als Token in den Link.

Sobald nun der User auf den Link klickt, musst du nur noch in der AccAktivierung.php den, durch den Link übermittelten, Token mit dem Wert in der DB abgleichen.
 
Hallo,

weis zwar gerade nicht was das eine mit dem anderen zu tun hat, liegt aber bestimmt an mir.

Verschlüssel doch einfach die E-Mail Adresse in der Variable:

Funkton für das ver- entschlüsseln
unten bei $schluessel kannst was eigenes eintragen, aber das gleiche bei beiden :O)
Das kannst ja als extra datei machen und immer nur includieren und schon kannst immer, überall was ver- bzw entschlüsseln
PHP:
<?php
##########################################################
############# XOR "Verschlüsselung" ######################
################### START ################################
function x0rcrypt($text, $schluessel) {
if (strlen($schluessel) == 0){return;}
$ergebnis = '';
$i = 0;
    while ($i < strlen($text)) {
             for ($j=0; $j < strlen($schluessel); $j++) {
             if ($i >= strlen($text)){break;}
             // Text XOR Schuessel
             $ergebnis .= $text{$i} ^ $schluessel{$j};
             $i++;
             }
    }
return($ergebnis);
}

// Hex nach Bin
// (triviale Funktion, aber vielleicht anschaulicher)
function hex2bin($string) {
    return pack('H*', $string);
}

// Verschlüsseln, Rückgabe in Hex
// (triviale Funktion, aber vielleicht anschaulicher)
function x0rencrypt($text, $schluessel) {
    return bin2hex(x0rcrypt($text, $schluessel));
}
// Entschlüsseln, Eingabe in Hex
// (triviale Funktion, aber vielleicht anschaulicher)
function x0rdecrypt($text, $schluessel) {
    return x0rcrypt(hex2bin($text), $schluessel);
}


function entsch($textent) {
         $schluessel = 'DEINSCHLUESSELalsoHAUPTSACHEnichtZUkurz';
    $ausgabe=x0rdecrypt($textent, $schluessel);
    return($ausgabe);
}

function versch($textent) {
         $schluessel = 'DEINSCHLUESSELalsoHAUPTSACHEnichtZUkurz';
    $ausgabe=x0rencrypt($textent, $schluessel);
    return($ausgabe);
}
#versch("zuverschlüsselndes")
#entsch("zuentschlüsselndes")
#################### ENDE ################################
############# XOR "Verschlüsselung" ######################
##########################################################
?>

Test ausgabe
PHP:
<?php

$EMailadresse="[email protected]"
echo $EMailadresse.'<br>';

$verschluesselt=versch($EMailadresse);
echo $verschluesselt.'<br>';

$entschluesselt=entsch($verschluesselt);
echo $entschluesselt.'<br>';

?>
oder wie CPCoder schreibt md5() geht natürlich auch das zu speichern und das dann zu prüfen im link.

Cheffchen
 
Werbung:
Ja aber wie geniere ich eine zufällige Zeichenkette^^ hab mit schon überlegt das mit rand() zu machen aber das sind dann halt nur Zahlen... Wie funktioniert das mit md5 ?

Ich will nicht die Email verschlüsseln, sondern:
Sobald man sich registriet hat bekommt man eine Email. In dieser Email, befindet sich ein Link, der einen token enthält(der token wird bei der Registration zufällig erstellt). Wenn man durch den Link auf die AccAktivierung.php kommt liest diese den token aus der url und vergleicht in mit dem gespeicherten, stimmen diese über ein wird der Acc aktiviert ;-)
eigentlich genau das was CPCoder geschrieben hat^^
 
Hallo,

na dann generiere doch zufällig ein string in dem E-Mail-Adresse und vielleicht id vom datensatz verschlüsselst. zufälliger geht nicht und vor allem einmalig :O)

MD5() verschlüsseld etwas, also auch emaladresse mit dem unterschied das dies nicht zurück entschlüsseln kannst, obwohl es Datenbanken gibt wo man http://www.html.de/php/44841-anfaengerfrage-wie-erstellt-man-einen-token-new-post.html verschlüsselung eingeben kann und dann das klartext zurück kommt.

Funktionieren tut das so

Cheffchen
 
Werbung:
Aber die Email zu nehmen ist glaub ich nicht so geschickt, denn offensichtlich baut md5 aus der selben email immer die selbe Zeichen folge :?

Das würde bedeuten, dass einfach jemand her gehen kann, irgend eine Email nehmen diese über md5 umwandeln, das Umgewandelte in die URL einfügen und dann aktivieren kann, ohne das es seine eigene Email ist :?
 
Zuletzt bearbeitet:
Hallo,

@Sentence: ja hast recht ist eine Prüfsumme da man das nicht zurück rechnen kann.


vollkommen richtig wenn einer alle 500 Milliarden(geschätzt) E-Mail-Adressen duch propiert und eine findet die bei dir drin steht :O)

Wie gesagt ich habe das so gelöst das ich die E-Mail und die DB id zusammen verschlüssel, damit müsste der böse erst mal die verschlüsselung knacken was sehr unwahrscheinlich ist und selbst wenn dann müste er zu der E-Mail auch den Datenbank datensatz wissen und das ist noch unwahrscheinlicher.

Cheffchen
 
Werbung:
Hallo,

ne, sondern in dem dir selber ein sting baust mit ein trenner

id||e-mail-adresse

135||testingen@testingen
wird
75767f322f372d3f212c3d3420222118161c3c283b37313d

12||[email protected]
wird
7577353231223d21153c3036243f050a5d1a2e
und mit PHP brauchst das entschlüsselte bloss mit explode auf || machen und schon hast E-Mail-Adresse und die ID aus der DB, wenn damit nicht klar ist das der richtige den Link gedrückt hat weiss ich auch nicht weiter.

Cheffchen
 
und mit PHP brauchst das entschlüsselte bloss mit explode auf || machen und schon hast E-Mail-Adresse und die ID aus der DB, wenn damit nicht klar ist das der richtige den Link gedrückt hat weiss ich auch nicht weiter.

Ich dachte md5 kann man nicht entschlüssen !? :?

Sry dumme frage aber :Soll das token mysql feld primery key haben ?

Sry das ich dir grad wahrscheinlich den letzten Nerv raub, aber ich bin halt noch Anfänger:roll:
 
Das Ziel der ganzen Aktion ist es, sicherzustellen, dass Mails ankommen und vor allem auch, dass der Empfänger derjenige ist, der die Anmeldung durchgeführt hat.

Dazu wird ein Token an die Adresse geschickt, das nur jemand kennen kann, der die Mail gelesen hat.

Wenn das Token einzig aus dem Anmelder bekannten Daten (E-Mail-Adresse, ID vermutlich auch) berechenbar ist (theoretisch belanglos, wie ausgetüftelt der Algorithmus ist), brauche ich die Mail nicht zu lesen. Das heißt, die Adresse braucht nicht zu existieren oder ich brauche nicht der Empfänger zu sein.

Deshalb darf das Token nicht (ausschließlich) auf dem Anmelder bekannten Daten basieren. Es muss zumindest eine „shared secret“-Komponente enthalten, die nur die Anwendung und der Leser der Mail kennen können. Die Nutzer-ID oder meinetwegen auch die Mail-Adresse können natürlich zusätzlich im Link enthalten sein. Das macht den Vergleich mit der Datenbank einfacher.
 
Werbung:
Also so sieht es bis jetzt aus :
Registrations code:
PHP:
<html xmlns="http://www.w3.org/1999/xhtml">

    <head>
        <meta http-equiv="content-type" 
            content="text/html;charset=utf-8" />
        <title>Registrierung erfolgt...</title>
        <link rel="stylesheet" type="text/css" href="Styles/style.css" />
    </head>
    
    <body>
        <?php
            mysql_connect("localhost", "******", "******") or die (mysql_error());
                // Datenbank auswählen
                mysql_select_db("Benutzer") or die(mysql_error());
                    $_username = mysql_real_escape_string($_POST['username']);
                    $_passwort = mysql_real_escape_string($_POST["passwort"]);
                    $_email = mysql_real_escape_string(strtolower($_POST["email"]));
                    
                    $_sql = "SELECT * FROM benutzer WHERE benutzername='$_username'";
                    
                    $_res = mysql_query($_sql);
                    $_anzahl = @mysql_num_rows($_res);
                    
                    $_sql_email = "SELECT * FROM benutzer WHERE email='$_email'";
                    
                    $_res_email = mysql_query($_sql_email);
                    $_anzahl_email = @mysql_num_rows($_res_email);
                    $_id= $row->id;
                    $_id_und_email=$_email||$_id
                    $_token=md5($_id_und_email)
                    
                    if (!isset($_POST["Submit"])) {
                        if (!empty($_passwort) and !empty($_username) and $_anzahl == 0 and check_email_mx($_email) and $_POST['passwort'] == $_POST['repeatedpasswort'] and empty($_anzahl_email) and isset($_POST["AGB"])){
                            echo "<p>Registrirung Erfolgreich :)</p>";
                            $strSQL = "INSERT INTO benutzer(benutzername, passwort, email, token) VALUES('".$_POST['username']."',  '".$_POST['passwort']."',   '".$_POST['email']."', '".$_token."')";
                            mysql_query($strSQL) or die (mysql_error());
                            $row = mysql_fetch_object($_res);
                            $_aktLink = <a href="/AccAktivierung.php?token="$_token>Klicken sie hier um ihren Acc zu aktivieren!</a>
                            mail($_email,"Acc aktivierung :)","
                                <B>Hallo :)</B><BR>
                                Bitte klicken sie den unten stehenden Link um ihren Account zu aktivieren.<br />
                                ".$_aktLink."<br /> 
                                Bitte anworten sie nicht auf diese Email, denn sie ist automatisch geniert. Iher PW-Games Service-Team ;)",
                                "From: PW-Games Aktivierungs-Service <[email protected]>
                                Content-Type: text/html");
                            header("Location: http://localhost/");
                            mysql_close();
                            exit();
                        }
                        if ($_anzahl > 0){
                            echo "<p>Benutzername bereits vorhanden!</p>";
                            include("Registrationsformular.html");
                            mysql_close();
                            exit();
                        }
                        if (!check_email_mx($_email)){
                            echo "<p>Keine gültige E-mail Adresse!</p>";
                            include("Registrationsformular.html");
                            mysql_close();
                            exit();
                        }
                        if ($_POST['passwort'] != $_POST['repeatedpasswort']){
                            echo "<p>Passwörter stimmen nicht über ein!</p>";
                            include("Registrationsformular.html");
                            mysql_close();
                            exit();
                        }
                        if ($_anzahl_email > 0){
                            echo "<p>Email bereits vorhanden!</p>";
                            include("Registrationsformular.html");
                            mysql_close();
                            exit();
                        }
                        if (empty($_username)){
                            echo "<p>Bitte geben sie einen Benutzernamen ein!</p>";
                            include("Registrationsformular.html");
                            mysql_close();
                            exit();
                        }
                        if (empty($_passwort)){
                            echo "<p>Bitte geben sie ein Passwort ein!</p>";
                            include("Registrationsformular.html");
                            mysql_close();
                            exit();
                        }
                        if (!isset($_POST["AGB"])){
                            echo "<p>Sie müssen die AGB aktzeptieren!</p>";
                            include("Registrationsformular.html");
                            mysql_close();
                            exit();
                        }
                    }
                // Schließt die Datenbankverbindung
            mysql_close();
        
        ?>
            <div id="text">Dieser Text wird vor Ablauf des ersten Countdowns angezeigt.</div><div id="zeit"></div>
            <script type='text/javascript'>
                Countdown(10);
                
                function Countdown(Zeit) {
                    Zeit--;
                    return Zeit
                }
            </script>
    </body>
    
</html>

<?php
function check_email_mx($email) {
    if(
        (preg_match('/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/', $email)) || 
        (preg_match('/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/',$email)) 
    ) {
        $host = substr($email, (strpos($email, '@')+1));
        if(checkdnsrr($host.'.', 'MX') ) return true;
        if(checkdnsrr($host.'.', 'A') ) return true;
        if(checkdnsrr($host.'.', 'CNAME') ) return true;
    }
    return false;
} 
?>

Betroffene Zeilen:
PHP:
                    $_id_und_email=$_email||$_id
                    $_token=md5($_id_und_email)
PHP:
                        if (!empty($_passwort) and !empty($_username)  and $_anzahl == 0 and check_email_mx($_email) and $_POST['passwort'] ==  $_POST['repeatedpasswort'] and empty($_anzahl_email) and  isset($_POST["AGB"])){
                            echo "<p>Registrirung Erfolgreich :)</p>";
                            $strSQL = "INSERT INTO  benutzer(benutzername, passwort, email, token)  VALUES('".$_POST['username']."',  '".$_POST['passwort']."',    '".$_POST['email']."', '".$_token."')";
                            mysql_query($strSQL) or die (mysql_error());
                            $row = mysql_fetch_object($_res);
                            $_aktLink = <a  href="/AccAktivierung.php?token="$_token>Klicken sie hier um ihren  Acc zu aktivieren!</a>
                            mail($_email,"Acc aktivierung :)","
                                <B>Hallo :)</B><BR>
                                Bitte klicken sie den unten stehenden Link um ihren Account zu aktivieren.<br />
                                ".$_aktLink."<br /> 
                                Bitte anworten sie nicht auf diese  Email, denn sie ist automatisch geniert. Iher PW-Games Service-Team ;)",
                                "From: PW-Games Aktivierungs-Service <[email protected]>
                                Content-Type: text/html");
                            header("Location: http://localhost/");
                            mysql_close();
                            exit();
                        }

Die AccAktivierung.php :
PHP:
<?php

    $_token=$_GET["token"];
    
    mysql_connect("localhost", "****", "*****") or die (mysql_error());
    // Datenbank auswählen
        mysql_select_db("Benutzer") or die(mysql_error());
        $_sql = "SELECT * FROM benutzer WHERE token='$_token'";
        $_res = mysql_query($_sql);
        $_anzahl = @mysql_num_rows($_res);
        
        if ($_anzahl > 0) {
            $strSQL = "UPDATE benutzer SET gesperrt='0'"; 
        }
    
?>

Sagt mir was falsch ist und was ich verbessern muss, dann passt ^^
 
Ich habe mir nicht den gesamten Code angesehen (ist ohnehin nicht alles von dir, nehme ich an), aber das hier

PHP:
                    $_id_und_email=$_email||$_id
                    $_token=md5($_id_und_email)

ist im Grunde genau das, womit sich mein erster Post befasst.
 
Ich habe alles selbst geschrieben um ehrlich zu sein(Was vermutlich der Grund für die vielen Fehler ist
icon_wink.gif
) bis auf die Email prüf Function :D
Die Linie ist aber Falsch:
PHP:
 $_aktLink = <a href="/AccAktivierung.php?token="$_token>Klicken sie hier um ihren Acc zu aktivieren!</a>
Ich weiß nicht genau wie man das schreiben muss, damit php das richtig kapiert :?
 
Zuletzt bearbeitet:
Werbung:
Hallo
PHP:
$_aktLink = '<a href="AccAktivierung.php?token='.$_token.'">Klicken sie hier um ihren Acc zu aktivieren!</a>';
Cheffchen
 
bis auf die Email prüf Function

Ah, okay. Ich wunderte mich, dass du da CNAME-Records checkst, aber keine Tokens generiert bekommst. Da habe ich gerade an der falschen Stelle geguckt.

Hat noch niemand so eine random-Funktion gepostet?

Falls nein, hier ein Ansatz (ohne Abfangen von Fehlern):

PHP:
<?php

function create_token($length = null, $chars = null)
{
        if ($length === null) {
                $length = 12;
        }

        if ($chars === null) {
                $chars = implode('', range('a', 'z'))
                        . implode('', range('0', '9'));
        }

        $charsArray = str_split($chars);

        $token = '';

        for ($i = 0; $i < $length; $i++) {
                shuffle($charsArray);
                $token .= $charsArray[0];
        }

        return $token;
}

var_dump(create_token());
var_dump(create_token(5, 'abcde'));
 
Ah genau sry...
der Code funktioniert jetz, aber die Email wurde nicht verschickt :?
Also entweder brauch der Server noch nen weilchen, oder da läuft irgendwas schief. Weist du vtl. woran das noch liegen könnte ? =)

Code:
PHP:
<html xmlns="http://www.w3.org/1999/xhtml">

    <head>
        <meta http-equiv="content-type" 
            content="text/html;charset=utf-8" />
        <title>Registrierung erfolgt...</title>
        <link rel="stylesheet" type="text/css" href="Styles/style.css" />
    </head>
    
    <body>
        <?php
            mysql_connect("localhost", "root", "R2d2C3pO") or die (mysql_error());
                // Datenbank auswählen
                mysql_select_db("Benutzer") or die(mysql_error());
                    $_username = mysql_real_escape_string($_POST['username']);
                    $_passwort = mysql_real_escape_string($_POST["passwort"]);
                    $_email = mysql_real_escape_string(strtolower($_POST["email"]));
                    
                    $_sql = "SELECT * FROM benutzer WHERE benutzername='$_username'";
                    
                    $_res = mysql_query($_sql);
                    $_anzahl = @mysql_num_rows($_res);
                    
                    $_sql_email = "SELECT * FROM benutzer WHERE email='$_email'";
                    
                    $_res_email = mysql_query($_sql_email);
                    $_anzahl_email = @mysql_num_rows($_res_email);
                    $row = mysql_fetch_object($_res);
                    $_id_und_passwort=$_email||$_passwort;
                    $_token=md5($_id_und_passwort);
                    
                    if (!isset($_POST["Submit"])) {
                        if (!empty($_passwort) and !empty($_username) and $_anzahl == 0 and check_email_mx($_email) and $_POST['passwort'] == $_POST['repeatedpasswort'] and empty($_anzahl_email) and isset($_POST["AGB"])){
                            echo "<p>Registrirung Erfolgreich :)</p>";
                            $strSQL = "INSERT INTO benutzer(benutzername, passwort, email, token) VALUES('".$_POST['username']."',  '".$_POST['passwort']."',   '".$_POST['email']."', '".$_token."')";
                            mysql_query($strSQL) or die (mysql_error());
                            $_aktLink= '<a href="AccAktivierung.php?token='.$_token.'">Klicken sie hier um ihren Acc zu aktivieren!</a>';  
                            mail($_email,"Acc aktivierung :)","
                                <B>Hallo :)</B><BR>
                                Bitte klicken sie den unten stehenden Link um ihren Account zu aktivieren.<br />
                                ".$_aktLink."<br /> 
                                Bitte anworten sie nicht auf diese Email, denn sie ist automatisch geniert. Iher PW-Games Service-Team ;)",
                                "From: PW-Games Aktivierungs-Service <[email protected]>
                                Content-Type: text/html");
                            header("Location: http://localhost/");
                            mysql_close();
                            exit();
                        }
                        if ($_anzahl > 0){
                            echo "<p>Benutzername bereits vorhanden!</p>";
                            include("Registrationsformular.html");
                            mysql_close();
                            exit();
                        }
                        if (!check_email_mx($_email)){
                            echo "<p>Keine gültige E-mail Adresse!</p>";
                            include("Registrationsformular.html");
                            mysql_close();
                            exit();
                        }
                        if ($_POST['passwort'] != $_POST['repeatedpasswort']){
                            echo "<p>Passwörter stimmen nicht über ein!</p>";
                            include("Registrationsformular.html");
                            mysql_close();
                            exit();
                        }
                        if ($_anzahl_email > 0){
                            echo "<p>Email bereits vorhanden!</p>";
                            include("Registrationsformular.html");
                            mysql_close();
                            exit();
                        }
                        if (empty($_username)){
                            echo "<p>Bitte geben sie einen Benutzernamen ein!</p>";
                            include("Registrationsformular.html");
                            mysql_close();
                            exit();
                        }
                        if (empty($_passwort)){
                            echo "<p>Bitte geben sie ein Passwort ein!</p>";
                            include("Registrationsformular.html");
                            mysql_close();
                            exit();
                        }
                        if (!isset($_POST["AGB"])){
                            echo "<p>Sie müssen die AGB aktzeptieren!</p>";
                            include("Registrationsformular.html");
                            mysql_close();
                            exit();
                        }
                    }
                // Schließt die Datenbankverbindung
            mysql_close();
        
        ?>
            <div id="text">Dieser Text wird vor Ablauf des ersten Countdowns angezeigt.</div><div id="zeit"></div>
            <script type='text/javascript'>
                Countdown(10);
                
                function Countdown(Zeit) {
                    Zeit--;
                    return Zeit
                }
            </script>
    </body>
    
</html>

<?php
function check_email_mx($email) {
    if(
        (preg_match('/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/', $email)) || 
        (preg_match('/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/',$email)) 
    ) {
        $host = substr($email, (strpos($email, '@')+1));
        if(checkdnsrr($host.'.', 'MX') ) return true;
        if(checkdnsrr($host.'.', 'A') ) return true;
        if(checkdnsrr($host.'.', 'CNAME') ) return true;
    }
    return false;
} 
?>
 
Werbung:
Zurück
Oben