DB-Eintrag ueber E-Mail (Link klicken) verifizieren / aktivieren

DB-Eintrag ueber E-Mail (Link klicken) verifizieren / aktivieren

am 23.09.2004 17:11:13 von Michael Rittweger

Hallo, allerseits!

Ich würde gerne etwas realisieren, das ich schon öfters auf einigen Seiten
gesehen habe. Leider fehlt mir dazu etwas der Ansatz:

a) Ein User füllt Felder eines Formulars (anzeige_neu.php) aus. Durch
"Absenden" wird in _blank ein neues Script (anzeige_eintragen.php)
aufgerufen.

b) Es wird nochmal alles hübsch formatiert dargestellt, auf Gültigkeit
überprüft und ggf. als Datensatz in eine Tabelle eingetragen (oder eine
Fehlermeldung ausgegeben). Dabei erhält ein Feld "verifiziert" des
Datensatzes den Wert "0".

c) Jetzt (also bei erfolgreichem Eintrag in die Tabelle) soll eine E-Mail
generiert werden, die an die Adresse geschickt wird, die der User mit
angegeben hat. In der E-Mail soll dann ein Link stehen, den er anklicken
kann.

(Das soll der Empfänger natürlich nur, wenn er wirklich der Absender der
Formular-Daten war und er auch wirklich ein Aktivieren des Datensatzes
will.)

d) Durch den Link (verifizieren.php) soll ohne weiteres Kuddelmuddel der
Wert im Feld "verifiziert" des entsprechenden Datensatzes von "0" auf "1"
geändert werden. Einfach der Hinweis "Eintrag erfolgreich aktiviert" reicht.

Die Schritte a) und b) stellen kein Problem dar, sind weitestgehend
realisiert. Auch d) müßte ohne große Probleme machbar sein. Probleme
bereitet mir c), insbesondere das Erstellen eines sinnvollen Links, denn
eine Mail verschicken bekomme ich auch noch hin.

Ich schätze mal, der Link müßte so in etwa aussehen:

http://www.meinedomain.tld/verifizieren.php?id=langesgeraffe l

Aber woraus und wie berechne ich jetzt am sinnvollsten "langesgeraffel"? Die
ersten Felder, die mir dazu einfallen würden: "anzeigeid" (integer, autoinc,
primary), "spitzname" (varchar 20, unique), "anzeigedatum" (datetime,
index).

In jedem Fall sollte der Parameter eine möglichst kryptische Darstellung
(z.B. 16-stellig hexadezimal?) der zugrundeliegenden Felder darstellen. Ich
möchte dadurch verhindern, daß jemand vollautomatisiert (und massenhaft)
Einträge in meine DB vornimmt, womöglich unter fremden Namen, und auch noch
aktiviert. (sonst könnte ich ja auch id=spitzname benutzen...)

Meine Fragen dazu jetzt:

a) Mit welchem Algorithmus könnte ich Felder des Datensatzes so
verschlüsseln, daß sie hübsch kryptisch aussehen, aber auch wieder
entschlüsselt werden können, um den passenden Datensatz zu finden?

b) Ich wollte (vorerst) ohne Session-IDs auskommen. Geht das? Oder komme ich
ohne die kaum sinnvoll weiter? Sollte ich dann die Session-ID als
Link-Parameter nehmen? Die müßte dann als Feld mit in den Datensatz, oder?

c) Oder bin ich völlig auf dem Holzweg und sollte einen ganz anderen Ansatz
benutzen?

Für direkte Hilfe und Verweise auf passende Literatur wäre ich in jedem Fall
dankbar.

Gruß, Michael

Re: DB-Eintrag ueber E-Mail (Link klicken) verifizieren / aktivieren

am 23.09.2004 17:41:31 von Andreas Mussgiller

Michael Rittweger wrote:

> Meine Fragen dazu jetzt:
>
> a) Mit welchem Algorithmus könnte ich Felder des Datensatzes so
> verschlüsseln, daß sie hübsch kryptisch aussehen, aber auch wieder
> entschlüsselt werden können, um den passenden Datensatz zu finden?
>
Ich nehme fuer solche Aufgaben immer md5() her. Du kannst die Operation
zwar nicht umkehren, aber das willst du glaube ich auch nicht. Ich wuerde
in einer weiteren Spalte diesen Schluessel ablegen und in verifizieren.php
nach dem Schluessel suchen.

> b) Ich wollte (vorerst) ohne Session-IDs auskommen. Geht das? Oder komme
> ich ohne die kaum sinnvoll weiter? Sollte ich dann die Session-ID als
> Link-Parameter nehmen? Die müßte dann als Feld mit in den Datensatz, oder?
>
Ja, die SessionID muesste in der DB auftauchen.

Andreas

Re: DB-Eintrag ueber E-Mail (Link klicken) verifizieren / aktivieren

am 23.09.2004 18:21:44 von DJ L

> > b) Ich wollte (vorerst) ohne Session-IDs auskommen. Geht das? Oder komme
> > ich ohne die kaum sinnvoll weiter? Sollte ich dann die Session-ID als
> > Link-Parameter nehmen? Die müßte dann als Feld mit in den Datensatz,
oder?
> >
> Ja, die SessionID muesste in der DB auftauchen.

SessionID würde ich nicht nehmen, da beim Session-Start der Browser hinter
jedem Link die SessionID mit anhängt. Das heißt, dass diese beim Mouse-Over
auf einen Link in der Statusleiste sichtbar ist.

CU DJ L.

Re: DB-Eintrag ueber E-Mail (Link klicken) verifizieren / aktivieren

am 23.09.2004 18:29:21 von Harald Trauernicht

Andreas Mussgiller schrieb:
> Michael Rittweger wrote:
>>a) Mit welchem Algorithmus könnte ich Felder des Datensatzes so
>>verschlüsseln, daß sie hübsch kryptisch aussehen, aber auch wieder
>>entschlüsselt werden können, um den passenden Datensatz zu finden?
>>
> Ich nehme fuer solche Aufgaben immer md5() her. Du kannst die Operation
> zwar nicht umkehren, aber das willst du glaube ich auch nicht. Ich wuerde
> in einer weiteren Spalte diesen Schluessel ablegen und in verifizieren.php
> nach dem Schluessel suchen.
>

Ich habe mir da mal irgendwann eine Funktion "organisiert", und sie dann
so umgeschrieben, dass sie halbwegs lesbare Zufallscodes in beliebiger
Länge ausgibt. Das ist sie:

function makeCode($CodeLength) {
// Aufgrund der Verwechslungsgefahr ohne folgende Zeichen:
// 1(eins) / I(groß i) / l(klein L) / 0(null) / O(groß o)
$CodeChars = '23456789'
.'ABCDEFGHJKLMNPQRSTUVWXYZ'
.'abcdefghijkmnopqrstuvwxyz';
$new_Code = '';

for ($index = 1; $index <= $CodeLength; $index++) {
// pick random number
$randomNumber = rand(1,strlen($CodeChars));
$new_Code .= substr($CodeChars,$randomNumber-1,1);
}
return $new_Code;
}

echo makeCode(16);
gibt dir dann einen notfalls aus der eMail abtippbaren Code an die Hand,
was bei vielen Usern leider nötig ist, wenn die URL in der eMail
umbricht, und sie sie von Hand im Browser eingeben wollen.

HTH
Harald

--
Ich bin so klug! Ich bin so klug! K-L-U-K! (Homer Simpson, singend)