Zur Navigation

Bestätigungslink

1 Frank

Hallo zusammen,

ich möchte gerne nach einer Anmeldung eine Bestätigungsmail versenden, in der dann der "Bestätigungslink" eine eigene "eindeutige" ID o.ä erhält. Wie bekomme ich das hin?

Im Moment steht in meinem Bestätigungslink als ID immer "...?id=0001" dann "...?id=0002" usw.! Diese Variante ist mir jedoch nicht sicher genug, da Sie manipulierbar ist! Wie kann ich gewährleisten, dass die Bestätigung des Links wirklich nur von der entsprechenden Person (an der ich den Bestätigungslink schicke) getätigt werden kann?

Gruß Frank

07.02.2007 09:13

2 Jörg Kruse

Hallo Frank,

du kannst eine Zufallszahl generieren, z.B. mit mt_rand():

$key = mt_rand(0,1000000000);

Die Zufallszahl wird in die Datenbank eingetragen und an den Bestätigungslink angehängt. Beim Aufruf des Links vergleichst du den Parameter mit dem Wert in der Datenbank

07.02.2007 09:51

3 Frank

Hallo Jörg,

super und vielen Dank! Dein Forum ist echt Klasse und Hilfe kommt auch immer sofort! Wollte ich nur mal gesagt haben! :-)

Gruß Frank

07.02.2007 09:56

4 Rudy

Hi Frank,

Jahr und Tag verwende ich für alle möglichen Registrierungen folgende Funktion, und sie hat mich noch nie enttäuscht:

function generateKey($length=50) { 
 $chrs = '0123456789_aAbBcCdDeEfFgGhHjJkKlLmMnNpPqQrRsStTuUvVwWxXyYzZ'; 
 $limit = strlen($chrs)-1;
 $key = NULL;
 while (strlen($key) < $length) {
   mt_srand(crc32(microtime())); 
   $chr = substr($chrs, mt_rand(0, $limit), 1); 
   if ($length < strlen($chrs)) {
     if(!strstr($key, $chr)) $key .= $chr; //bessere Ergebnisse bei kurzen Keys
   } else {
     $key .= $chr;
   }
 }
 return $key; 
}
zu benutzen wie folgt:

$key = generateKey(); //generiert einen Schlüssel mit 50 Zeichen
echo $key;

Beispielausgabe:
u3AkrblH00_gWL8c7YRFMn9Q6SPsCmjGfBEzva4h1V5wdNxXqp

$key = generateKey('10') //generiert einen Schlüssel mit 10 Zeichen

Wenn Du einen derartigen Schlüssel mit 50 Zeichen im System wie Jörg bereits vorschlug zwischenspeicherst, ist das sehr sicher.

Ciao,
Rudy

07.02.2007 20:48

5 Marcel (Gast)

Benutzt du wirklich einen 50-stelligen Code?
Ich denke, eine Zahlenfolge von 8 Zeichen (so verfahre ich) hat den selben Zweck und ist genauso wenig manipulierbar.

07.02.2007 20:58

6 Rudy

Benutzt du wirklich einen 50-stelligen Code?
Ja, mancherorts auch 100. Ich muss zugeben, beim Thema Sicherheit bin ich grundsätzlich paranoid :)

07.02.2007 21:24

7 Marcel (Gast)

Was für einen Unterschied macht es denn deiner Meinung nach?

07.02.2007 22:34

8 Rudy

Die Anzahl der Permutationen ist so hoch, dass keiner nur daran denken wird zu versuchen, eine offene Bestätigung durch einen direkten Angriff zu erhaschen. Das beruhigt mich bei den langen Keys.

07.02.2007 22:43

9 suerte (Gast)

Hey bin grad dabei meinen login bereich auf meiner homepage zu kreieren. datenbank und alles funktioniert prima. sprich ich kann name pass und email adresse angeben. es wird auch eine email geschickt wie z.B. Hallo Sie haben sich bei X angemeldet. Aber das mit dem bestätigungslink ist mir noch nicht so eindeutig. also ich könnte dann zum beispiel noch eine bestaetigung.php datei schreiben.

wenn ich jetzt durch sagen wir mal $key = mt_rand(0,1000000000); eine zahl generiere, hänge ich die einfach an meinen link Beispiel:

http://bla.de/bestaetigung.php/$key

aber wenn ich dann da drauf klicke exestiert ja diese datei also z.B.

http://bla.de/bestaetigung.php/11111111 nicht. wie mache ich das denn?

22.05.2008 18:28

10 Jörg Kruse

Hallo suerte,

wenn $key ausgewertet werden soll (als $_GET['key']), dann muss die Variable folgendermaßen übertragen werden:

http://bla.de/bestaetigung.php?key=11111111

Wenn du die Variante http://bla.de/bestaetigung.php/11111111 verwenden möchtest, musst du diese auf die obige URL rewriten, z.B. mit folgender Modrewrite-Rule in der .htaccess (ungetestet):

RewriteEngine on

RewriteBase /

RewriteRule ^bestaetigung\.php/(.+)$ bestaetigung.php?key=$1

22.05.2008 22:19 | geändert: 22.05.2008 22:19