Du bist nicht angemeldet.

Lieber Besucher, herzlich willkommen bei: WebStyleBoard. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

Samstag, 14. Juni 2003, 00:00

Login (Grundlage einer Benutzerwaltung) mit PHP und mySQL

Dieser Beitrag soll die Grundzüge eines Loginsystems auf der Grundlage von PHP und mySQL erklären.

Die verwendeten Codebeispiele und SQL-Statements erheben nicht den Anspruch 100% fehlerfrei zu sein, also bitte nicht wundern, falls ein parse error auftauchen sollte (Ich hab's nich so mit Komma(s|tata) )

Sodele, jetzt geht's aber los...

Inhaltsverzeichnis:
  1. Sinn und Zweck
  2. Gründe für PHP und mySQL
  3. Aufbau der Tabelle
  4. Das Passwort
  5. Der Beispieluser
  6. Das Loginformular
  7. Das Einloggen
  8. Die Prüfung
  9. Das Ausloggen
  10. Der Schluss



1 Sinn und Zweck

Der Sinn und Zweck einer Benutzerverwaltung sollte wohl jedem klar sein. Grob gesagt sprechen folgende Gründe dafür:

Der Webmaster kann
  • entscheiden, wer wann welche Teile der Seite zu sehen bekommt (inkl. Downloads)
  • nachvollziehen, welcher Benutzer wann wo war
  • nachvollziehen, wer wann was gemacht hat
  • Benutzer, die sich etwas zu Schulden kommen ließen, sperren
  • ganz allgemein gesagt entscheiden, dass Herr X bestimmte Aktionen machen darf, Herr Y andere und Herr Z nur ein paar der Aktionen die Herr X machen darf


2 Gründe für PHP und mySQL

Der Login (als ein Bauteil einer Benutzerverwaltung) muss auf dem Server ablaufen, auf dem die Seiten gespeichert sind. Das impliziert die Voraussetzung, dass eine Möglichkeit gegeben sein muss, auf dem Server Benutzereingaben auszuwerten und entsprechend darauf zu reagieren.

PHP ist eine kostenlose Skriptsprache, die von vielen Webhostern zur Verfügung gestellt wird und serverseitige Aktionen erlaubt. Die Syntax ist an C angelehnt, jeder, der damit schon Erfahrung hat, wird sich sofort zurecht finden, jeder andere wird es schnell lernen.
An dieser Stelle sei kurz auf http://www.php.net verwiesen und dort insbesondere auf das Handbuch (neudeutsch Manual)

Die Daten für den Login, gegen die die Eingaben des Benutzers zum einloggen abgeprüft werden, müssen natürlich auch gespeichert werden. Hierzu gibt es (wie so oft) mehrere Möglichkeiten:
  • Die Daten werden direkt im Skript gespeichert
    o Am einfachsten zu realisieren, aber wehe, es kommen Benutzer hinzu oder es sollen Passwörter geändert werden
    o Ganz zu schweigen von den oben erwähnten Funktionen
    o …
  • Die Daten werden in Textdateien gespeichert
    o Schon besser, aber auch unkomfortabel
    o Entweder für jeden Benutzer eine eigene Datei, oder eine Datei für alle; auf jeden Fall schwierig zu erweitern
  • Die Daten werden in einer Datenbank gespeichert
    o Einfache Verwaltung
    o Flexibel


3 Aufbau der Tabelle

Theoretisch kann der Webmaster auswählen, ob er die Daten aller Benutzer in einer Tabelle haben will, oder für jeden Benutzer eine separate Tabelle anlegen will.
Praktisch ist es, die Daten aller Benutzer in einer Tabelle zu speichern.
Dieses Vorgehen erleichtert eine spätere Anpassung der Datenstruktur, da so unabhängig von der Anzahl an Benutzern nur eine Tabelle modifiziert werden muss.

Die Tabelle benötigt auf jeden Fall die folgenden Felder:
  • Name des Benutzers, mit dem er im System agieren will (vergleichbar dem Nickname in einem Forum wie dem WebStyleBoard)
    Da der Name zur Authentifizierung genutzt wird, muss er eindeutig sein.
    In mySQL wird das über UNIQUE erledigt.
  • Passwort des Benutzers

Weitere optionale Felder:
  • Mail-Adresse des Benutzers
    An diese Adresse kann z. B. ein neues Passwort geschickt werden oder es können Meldungen des Webmasters an diese Adresse gesendet werden
  • Anzahl der fehlerhaften Loginversuche
  • Ein Feld, dass anzeigt, ob der Benutzer gesperrt ist
  • Ein Feld, dass anzeigt, ob der Benutzer seinen Account aktiviert hat
    Dieses Feld kann z. B. auch dazu verwendet werden, die Echtheit der Mail-Adresse zu prüfen.
  • ...


Ein nicht essentielles Feld, das aber dennoch zu empfehlen ist, ist die ID des Users.
Diese ID ist eine eindeutige Zahl, anhand derer ein User ganz zweifelsfrei und unproblematisch identifiziert werden kann.
Ebenfalls empfehlenswert ist eine Spalte, in der die ID der Session des Benutzers steht.


Damit ergibt sich folgender Aufbau für die Benutzertabelle:

Quellcode

1
2
3
4
5
6
7
8
CREATE TABLE users
(
userid int(11) PRIMARY KEY auto_increment,
UserNick varchar(20) NOT NULL DEFAULT '',
UserPass varchar(32) NOT NULL DEFAULT '',
UserSession varchar(32),
UNIQUE KEY UserNick (UserNick)
)



4 Das Passwort

Das wird keine Abhandlung über das Generieren eines sicheren Passworts und es wird sich auch kein Hinweis darauf finden, Passphrasen wie geheim, 007, passwort, dem Geburtstag des Kanarienvogels rückwärts zu verwenden (abgesehen von diesem Hinweis ;))

Es ist aber immer eine gute Idee, die Passwörte nicht einfach so abzuspeichern, sondern verschlüsselt.
Zum Verschlüsseln bietet sich die mySQL-Funktion MD5 an.

Wenn das Passwort verschlüsselt ist, muss natürlich auch das eingegebene Passwort verschlüsselt werden und dann mit dem verschlüsselten in der Tabelle gespeicherten Passwort verglichen werden.


5 Der Beispieluser

Zum Nachvollziehen und Testen des hier Geschrieben wird jetzt ein Benutzer angelegt:

Quellcode

1
2
3
INSERT INTO users
(UserNick, UserPass)
VALUES ('admin', MD5('pass'))


Jetzt ist ein Benutzer angelegt, dessen Logindaten folgendermaßen lauten:
  • Name: admin
  • Passwort: pass



6 Das Loginformular

Zum Einloggen wird natürlich ein Formular benötigt, in das der Benutzer in spe seine Daten eingeben kann:

Quellcode

1
2
3
4
5
6
7
<form method="POST" action="do_login.php">
	  <p>
		    Name: <input type="text" name="nick" /><br />
		    Passwort: <input type="password" name="pass" /><br />
		    <input type="submit" name="login" value="Alla hopp" />
	  </p>
</form>



7 Das Einloggen

In der Datei do_login.php müssen die Eingaben des Benutzers jetzt geprüft werden:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
session_start() or die('Konnte Session nicht starten');
if (!isset($_POST['login']))
// Das Formular wurde nicht abgeschickt
    die('Formular wurde nicht abgeschickt!');

//Zusammenbasteln des SQL-Statements
$SQL='SELECT userid
FROM users
WHERE UserNick='.$_POST['nick']." AND UserPass=MD5('".$_POST['pass']."'
LIMIT 1";


//Testweise ausgeben
echo '<pre>'.$sql.'</pre>';

//Verbinden mit der Datenbank
$connect=@mysql_connect('host''user''passwort') or die(mysql_error());
@mysql_select_db('Name der Datenbank, die die Tabelle beinhaltet'$connect) or die(mysql_error());

//SQL-Statement ausführen
$result=mysql_query($sql) or die(mysql_error());

//Datensatz in Array einlesen
$user=@mysql_fetch_assoc($result) or die(mysql_error());

if (!is_array($user))
//Kein Datensatz gefunden
    die('Die Kombination aus '.$_POST['nick'].' Und '.$_POST['pass'].' ist nicht korrekt!');

//Zusammenbasteln des SQL-Statements
$SQL="UPDATE users
SET UserSession='".session_id()."'
WHERE userid=".$user['userid'];

//Einloggen
@mysql_query($sql) or die(mysql_error());
?>



8 Die Prüfung

Jetzt muss noch geprüft werden, ob der Mensch, der eine Seite aufruft auch eingeloggt is. Dazu ist folgender Code ist auf jeder Seite einzubauen und zwar ganz am Anfang, vor jeglicher Ausgabe:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
<?php
session_start() or die('Konnte Session nicht sarten');
include 'pfad/zur/check_login.php';
$user=logged_in();
if (!$user['logged_in'])
//Nicht eingeloggt
    header('location: login.php');
echo 'Hallo '.$user['UserName'].'<p />Folgende Daten stehen zur Verfügung:<pre>';
print_r($user);
echo '</pre>Bitte beachten Sie, dass das Passwort, das Sie sehen, verschlüsselt angezeigt wird.';
?>


So, das war's, fehlt bloß noch die Funktion logged_in. Die Funktion wird in der Datei check_login.php gespeichert und hat folgenden Inhalt:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
function logged_in()
{
//Abfrage zusammenbasteln
$SQL="SELECT *
FROM users
WHERE UserSession='".session_id()."'";

//Testweise ausgeben
echo '<pre>'.$sql.'</pre>';

//Verbinden mit der Datenbank
$connect=@mysql_connect('host''user''passwort') or die(mysql_error());
@mysql_select_db('Name der Datenbank, die die Tabelle beinhaltet'$connect) or die(mysql_error());

//SQL-Statement ausführen
$result=mysql_query($sql) or die(mysql_error());

//Datensatz in Array einlesen
$user=@mysql_fetch_assoc($result) or die(mysql_error());

$user['logged_in']=(@mysql_num_rows($result)==1);

return $user;
}
?>



9 Das Ausloggen

Sollte ein angemeldeter Benutzer auf den wahnwitzigen Gedanken kommen, sich auszuloggen, muss zum einen die Session zerstört werden und zum anderen der Wert in der Spalte UserSession des benutzers entfernt werden

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
session_start() or die('Konnte Session nicht sarten');
include 'pfad/zur/check_login.php';
$user=logged_in();
if ($user['logged_in'])
{
    //SQL-Anweisung zusammenbasteln
    $SQL="UPDATE users
    SET UserSession=NULL
    WHERE UserSession='".session_id()."'";

    //SQL-Befehl ausführen
    @mysql_query($sql) or die(mysql_error());

    //Session zerstören
    session_destroy();
}




10 Der Schluss

Das waren die Grundzüge eines Logins, ich hoffe, es war sowohl verständlich als auch hilfreich.

Bei Kritik, Fragen, Lob und Anerkennung gilt: Immer her damit!

Bei Fragen nach der Implementierung der erwähnten optionalen Felder und den dazu nötigen Funktionen könnt ihr auch einfach ein paar Zeilen schreiben. Wenn ich Zeit habe, werde ich mich dransetzen.

Dann noch viel Spaß bei was auch immer ihr jetzt noch tun werdet

mr_happiness

[edit]
Bin ja ein richtiger Frühaufsteher, das war der erste Thread heute (14.06.2003) :D
[/edit]
Signatur von »mrhappiness« Ich denke, also bin ich. Einige sind trotzdem...

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »mrhappiness« (14. Juni 2003, 11:49)


2

Samstag, 14. Juni 2003, 00:23

Eigentlich wollte ich nur noch mal rasch im WSB vorbeischauen (hab einiges zu tun; auch um diese Zeit), aber ich möchte mir den kleinen Moment Zeit nehmen und ein dickes Lob an Mr_Happiness aussprechen! :) Er ist nämlich der erste, der meiner Hausaufgabe gefolgt ist. Ich denke, dass Ergebnis kann sich sehen lassen (werde es morgen in Ruhe durchlesen).

Besten Dank,
Investorman

3

Samstag, 14. Juni 2003, 01:35

Hallo!

Sehr schön. Finde ich klasse. Auch von mir ein überhaupt nicht von oben gemeintes dickes Lob.

Mirko :)

4

Samstag, 14. Juni 2003, 11:34

RE: Login (Grundlage einer Benutzerwaltung) mit PHP und mySQL

Zitat

Original von mr_happiness
Hierzu gibt es (wie so oft) mehrere Möglichkeiten:
  • Die Daten werden direkt im Skript gespeichert
    o Am einfachsten zu realisieren, aber wehe, es kommen Benutzer hinzu oder es sollen Passwörter geändert werden
    o Ganz zu schweigen von den oben erwähnten Funktionen
    o …
  • Die Daten werden in Textdateien gespeichert
    o Schon besser, aber auch unkomfortabel
    o Entweder für jeden Benutzer eine eigene Datei, oder eine Datei für alle; auf jeden Fall schwierig zu erweitern
  • Die Daten werden in einer Datenbank gespeichert
    o Einfache Verwaltung
    o Flexibel


Hier sollte man dann auch sagen, dass man MySQL benutzt. Ein kleiner Infosatz reicht.

Zitat

Original von mr_happiness

Quellcode

1
2
3
INSERT INTO users
(UserNick, UserPass)
VALUES '‘admin', MD5('pass'))


Jetzt ist ein Benutzer angelegt, dessen Logindaten folgendermaßen lauten:[list[*]Name: admin[*]Passwort: pass[/list]

Hier ist ein Typo bei der Erstellung der Liste. Hier sollte man auch noch zeigen, wie der Datensatz in der Datenbank aussieht.

Zitat

Original von mr_happiness

Quellcode

1
2
3
4
5
6
7
<form method="POST" action="do_login.php">
	  <p>
		    Name: <input type="text" name="nick"” /><br />
		    Passwort: <input type="password" name="pass" /><br />
		    <input type="submit" name="login" value="Alla hopp" />
	  </p>
</form>


Das <label>-Element fehlt, als logischen Bezug von Beschriftung zu Input-Element. Und im Nickname-Feld ist ein Anführungszeichen zuviel.

Zitat

Original von mr_happiness

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
session_start() or die('Konnte Session nicht starten');
if (!isset($_POST['login']))
// Das Formular wurde nicht abgeschickt
    die('Formular wurde nicht abgeschickt!');

//Zusammenbasteln des SQL-Statements
$SQL='SELECT userid
FROM users
WHERE UserNick='.$_POST['nick']." AND UserPass=MD5('".$_POST['pass']."'
LIMIT 1";


//Testweise ausgeben
echo '<pre>'.$sql.'</pre>';

//Verbinden mit der Datenbank
$connect=@mysql_connect('host''user''passwort') or die(mysql_error());
@mysql_select_db('Name der Datenbank, die die Tabelle beinhaltet'$connect) or die(mysql_error());

//SQL-Statement ausführen
$result=mysql_query($sql) or die(mysql_error());

//Datensatz in Array einlesen
$user=@mysql_fetch_assoc($result) or die(mysql_error());

Hier ist das @ fehl am Platz. Wenn überhaupt bei mysql_query() benutzen.

Zitat

Original von mr_happiness

PHP-Quelltext

1
2
3
if (!is_array($user))
//Kein Datensatz gefunden
    die('Die Kombination aus '.$_POST['nick'].' Und '.$_POST['pass'].' ist nicht korrekt!');

ein kleines 'und' ;)

Zitat

Original von mr_happiness

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
<?php
session_start() or die('Konnte Session nicht sarten');
include 'pfad/zur/check_login.php';
$user=logged_in();
if (!$user['logged_in'])
//Nicht eingeloggt
    header('location: login.php');
echo 'Hallo '.$user['UserName'].'<p />Folgende Daten stehen zur Verfügung:<pre>';
print_r($user);
echo '</pre>Bitte beachten Sie, dass das Passwort, das Sie sehen, verschlüsselt angezeigt wird.';
?>

Das Error-Reporting sollte man vielleicht etwas hochsetzen. Am besten mit error_reporting.

Zitat

Original von mr_happiness
So, das war's, fehlt bloß noch die Funktion logged_in. Die Funktion wird in der Datei check_login.php gespeichert und hat folgenden Inhalt:

PHP-Quelltext

1
2
<?php
//Abfrage zusammenbasteln


Wenn es wirklich eine Funktion ist, muss sie auch einen Funktionskopf wie "function logged_in()" haben.

Zitat

Original von mr_happiness

PHP-Quelltext

1
2
3
$SQL="SELECT *
FROM users
WHERE UserSession='".session_id()."'";


Man benutzt kein SELECT *, siehe:
16.14. Warum soll ich nicht SELECT * schreiben?
http://www.dclp-faq.de/q/q-sql-select.html

Zitat

Original von mr_happiness

PHP-Quelltext

1
$user=@mysql_fetch_assoc($result) or die(mysql_error());


Das selbe wie oben

Zitat

Original von mr_happiness

PHP-Quelltext

1
$user['logged_in']=(@mysql_num_rows($result)==1);

Hier ist vielleicht folgendes besser.

PHP-Quelltext

1
$user['logged_in']=mysql_num_rows($result)?1:0;

Es könnte probleme geben, da 'false' nicht als 0 sondern als ein leerer Wert gespeichert wird. Hier bin ich mir aber nicht sicher.

Zitat

Original von mr_happiness

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
session_start() or die('Konnte Session nicht sarten');
include 'pfad/zur/check_login.php';
$user=logged_in();
if ($user['logged_in'])
{
    //SQL-Anweisung zusammenbasteln
    $SQL="UPDATE users
    SET UserSession=NULL
    WHERE UserSession='".session_id()."'";

    //SQL-Befehl ausführen
    @mysql_error($sql) or die(mysql_error());

    //Session zerstören
    session_destroy();
}
Ich bin mir nicht sicher, aber man kann hier ggf. die Session von einem anderen User klauen und dann seine Session zerstören, obwohl das Opfer das garnicht wollte. Vielleicht die IP-Addresse mitspeichern
Signatur von »Progman« http://tut.php-q.net/ - http://www.htmlwiki.de/
Key fingerprint: 2A86 124E 9889 1701 B138 6B48 1123 E583 873D 7947
Key ID: 0x873D7947

5

Samstag, 14. Juni 2003, 11:46

RE: Login (Grundlage einer Benutzerwaltung) mit PHP und mySQL

Zitat

Original von Progman
Hier sollte man dann auch sagen, dass man MySQL benutzt. Ein kleiner Infosatz reicht.

Dachte, es reicht, wenn es im Titel und in den ersten Sätzen steht

Zitat

Hier ist ein Typo bei der Erstellung der Liste.
Typo korrigiert

Zitat

Das <label>-Element fehlt, als logischen Bezug von Beschriftung zu Input-Element. Und im Nickname-Feld ist ein Anführungszeichen zuviel.
Hab ich weggelassen, weil ich es für die Funktionalität login nicht als wichtig erachtet habe. (Trotzdem nicht schön, ich weiß)

Zitat

Hier ist das @ fehl am Platz. Wenn überhaupt bei mysql_query() benutzen.
aber schaden tut's nich :)

Zitat

Das Error-Reporting sollte man vielleicht etwas hochsetzen. Am besten mit error_reporting.
und wozu?
hat doch mit dem login nix zu tun sondern is eher ne grundlegende sache oder?
abgesehen davon, steht es bei mir auf E_ALL steht :D

Zitat

Wenn es wirklich eine Funktion ist, muss sie auch einen Funktionskopf wie "function logged_in()" haben.
Ups, erledigt

Zitat

Man benutzt kein SELECT *, siehe:
16.14. Warum soll ich nicht SELECT * schreiben?
http://www.dclp-faq.de/q/q-sql-select.html
ich weiß, aber der Einfachheit halber, hab ich das trotzdem so gemacht. Da ich nicht vorhabe BLOBs abzuspeichern sollte es auch nich zu tragisch sein

Zitat


Hier ist vielleicht folgendes besser.

PHP-Quelltext

1
$user['logged_in']=mysql_num_rows($result)?1:0;

Es könnte probleme geben, da 'false' nicht als 0 sondern als ein leerer Wert gespeichert wird. Hier bin ich mir aber nicht sicher.
und warum besser? ob false jetzt als false, als 0 oder als leerer wert (was NULL wäre und daher zeimlich ausgeschlossen) gespeichert wird is doch egal, solange es nicht als 1 gespeichert wird

Zitat

Ich bin mir nicht sicher, aber man kann hier ggf. die Session von einem anderen User klauen und dann seine Session zerstören, obwohl das Opfer das garnicht wollte.
wenn Herr PHP bei mir die gleiche session-id generiert wie bei dir, dan ja, aber wenn dem so sein sollte, is das ganze session-konzept hyperfluid und suboptimal oder?

Zitat

Vielleicht die IP-Addresse mitspeichern
besser nicht, AOL-User mögen dich dann nicht mehr und auch andere Leute, die zwischendurch den proxy wechseln mögen dich nicht, ganz zu schweigen von z.b. studenten, die alle über einen proxy ins netz gehen und dahe rnach außen hin auch nur eine IP haben...

Aber danke für die Anregungen, ich seh schon, ich kann mich steigern :D

P.S. Ich gelobe, bei Erweiterungen extremst sorgfältigst darauf zu achten "und" klein zu schreiben, wenn es klein geschriebenwerden muss und alles detaillierter / beispielhafter aufzubauen :D
Signatur von »mrhappiness« Ich denke, also bin ich. Einige sind trotzdem...

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »mrhappiness« (14. Juni 2003, 11:52)


6

Samstag, 14. Juni 2003, 13:28

RE: Login (Grundlage einer Benutzerwaltung) mit PHP und mySQL

Zitat

Original von Progman

Zitat

Original von mr_happiness

PHP-Quelltext

1
$user['logged_in']=(@mysql_num_rows($result)==1);

Hier ist vielleicht folgendes besser.

PHP-Quelltext

1
$user['logged_in']=mysql_num_rows($result)?1:0;

Es könnte probleme geben, da 'false' nicht als 0 sondern als ein leerer Wert gespeichert wird. Hier bin ich mir aber nicht sicher.
Öhmmm so wie ich das sehe, soll $user['logged_in'] doch gar nicht gespeichert werden...ansonsten ist ein Typecast nach integer sicherlich eleganter.
Signatur von »Darii« Against TCPA - TCPA heißt Freiheit verlieren
D.A.R.I.I.: Digital Artificial Replicant Intended for Infiltration

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Darii« (14. Juni 2003, 13:28)


7

Sonntag, 15. Juni 2003, 21:17

Ohne dir jetzt die Stimmung zu vermiesen aber ForWebmaster hat schon ein Tutorial zu diesem Thema: http://www.forwebmaster.de/scriptsprache…gin/login1.html

Das liegt an der mangelhafen Beitragbündelung ;)

Ein eigenständiges CMS dafür - wie Mirko und Chaca schon einmal im Chat diskutiert haben - wäre sicher genial. Im WSB habe ich irgendwie die Angst das unsere Beiträge untergehen ...

Tobias
Signatur von »t-ob-i« {SIGNATUR}

8

Montag, 9. August 2004, 17:04

Also was mich jetzt mal interessieren würde ist, wie man es grob realisiert, dass der
User sich über einen Link, den er per Mail zugeschickt bekommt, freischalten kann.
Das ganze soll natürlich zum überprüfen der Emailadresse dienen. :D

Eigentlich müsste man doch nur zwei Spalte in die Tabellenstruktur mit aufnehemen
und bei der Registrierung des Users einen String abspeichern.
Die eine Spalte soll dann eine Variable vom Typ string oder so was sein und die andere vom Typ boolean um nach der erfolgreichen freischaltung eine Variable z.B. von false auf True setzen.

Bei der Registrieung des Users müsste man dem User
eine Emailadresse zuschicken mit einem Link in der Form htttp://meineUrl.de/freischalten.php?string=9sd8f9asdfkasdflao
und diesen String natürlich in der Datenbank auch abspeichern
Wenn dann der Get parameter mit dem abgespeichertem String in der Datenbank übereinstimmt, kann man dann wie gesagt diese Variable von false auf true setzen und
der User ist freigeschaltet. :D

Damit der User nicht ein zweites mal auf diesen Link klickt, kann man ja noch abfragen,
ob dieses Variable schon true ist und damit ein Fehler aufgetreten ist.
Beim Burningboard kommt zumindest so eine Meldung, wenn man erneut diesen Link eingibt.


Wenn man es so macht, wie ich es vorgeschlagen habe, verschwendet man aber quasi speicherplatz. Geht es auch ohne zwei Spalten oder gibt es vielleicht eine bessere Lösung?
Würde das überhaupt so einfach funktionieren wie ich das gemeint habe?? :wallbash:

grüsse
oop1
Signatur von »oop1« _________

9

Montag, 9. August 2004, 19:45

ich habe bei mir zwei weitere spalten:

user_active int(1)
user_activationcode char(32)

vorgehensweise bei mir:
$code = md5(microtime());
$code in spalte user_activationcode
$code = md5($userid.$code);

bestätigungslink: activate.php?id=$code
UPDATE tabelle
SET user_active = 1
WHERE MD5(CONCAT(user_id, user_activationcode)) = mysql_escape_string($_GET['id'])

eine abfrage ob der user schon aktiviert ist habe ich mir gespart, er kann seinen account ja ruhig mehrmals aktivieren *g*

die spalte user_active hätte ich mir sparen können und einfach nur eine 1 in die spalte user_activationocde schreiben können, aber wenn ih prüfen will, ob ein user aktiv ist, dann ist der vergleich mit einer integer-spalte schneller als mit einem string

edit:
rein theoretisch könntest du auch die user_id, das passwort und die mail-adresse "md5en" und das UPDATE dementsprechend anpassen, dann reicht dir nur die spalte user_active, aber mir gefällt es so eben besser
Signatur von »mrhappiness« Ich denke, also bin ich. Einige sind trotzdem...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »mrhappiness« (9. August 2004, 19:46)


10

Montag, 9. August 2004, 22:22

Ok, ich verstehe das zwar nicht alles, aber
das Prinzip derÜüberprüfung der mailadresse ist mir jetzt klar.

die Idee mit dem
user_id, das passwort und die mail-adresse "md5en" verstehe ich nicht ganz.

Es würde doch eigentlich reichen, wenn man z.B. NUR die mail-adresse md5en
würde. Was bringt es, wenn man die mail adresse, das Passwort etc zusammenfast und
dann md5t?

Im Prinzip geht es doch nur darum einen string zu haben, der nicht bei jedem User
gleich ist. Das Md5en der mail-adresse würde meiner Meinung nach ausreichen.


Im Prinzip könnte es ja auch eine sessionID oder so was sein, die man vergleicht. Allerdings
müssste man ja dann bei der Registrierung auch nochmal eine session starten, um eine ID
zu erhalten.
Signatur von »oop1« _________

11

Dienstag, 10. August 2004, 08:00

Zitat von »oop1«

Im Prinzip geht es doch nur darum einen string zu haben, der nicht bei jedem User gleich ist.
wenn du damit meinst, dass du einen string brauchst, der für jeden user verschieden ist: ja

ich hab mich auch nochmal hingesetzt und mache es nun so:
zufälligen string generieren( 32 zeichen lang, zahlen, buchstaben, sonderzeichen)
dadran die id des users anhängen

ergebnis:
1354sdf6w4§(*_75674647_46761ax|y45

hier wäre die userid dann die 45 und ich mache das UPDATE da, wo user_activationcode = erste 32 zeichen AND user_id = rest

das ist durch anhängen der user_id auf jeden fall eindeutig
Signatur von »mrhappiness« Ich denke, also bin ich. Einige sind trotzdem...

12

Dienstag, 10. August 2004, 09:29

Sehr hilfreiches Tutorial!

Wie könnte man denn eine "Passwort vergessen" am praktischsten realisieren? Es wird warschenlich nicht möglich sein, per md5 verschlüsselte Passwörter zu decodieren, oder?

Am sichersten währe warscheinlich ein zufällig generiertes PW über das alte zu schreiben (natürlich auch mit md5), dieses neue Passwort (unverschlüsselt) dem User zuzusenden, oder? Dieser könnte sich dann damit einloggen, und anschließend das passwort ändern..

Gibt es elegantere oder (für den User) einfachere Lösungen?

13

Dienstag, 10. August 2004, 09:44

Zitat von »streifenkiste«

Sehr hilfreiches Tutorial!
danke

Zitat

Wie könnte man denn eine "Passwort vergessen" am praktischsten realisieren? Es wird warschenlich nicht möglich sein, per md5 verschlüsselte Passwörter zu decodieren, oder?
richtig

Zitat

Am sichersten währe warscheinlich ein zufällig generiertes PW über das alte zu schreiben (natürlich auch mit md5), dieses neue Passwort (unverschlüsselt) dem User zuzusenden, oder? Dieser könnte sich dann damit einloggen, und anschließend das passwort ändern..
auch richtig, eventuell noch mit zusätzlichem aktivierungslink, aber das ist wirklich hochgradig optional :)

Zitat

Gibt es elegantere oder (für den User) einfachere Lösungen?
abgesehen vom unverschlüsselten speichern des passworts: nein
Signatur von »mrhappiness« Ich denke, also bin ich. Einige sind trotzdem...

14

Sonntag, 22. August 2004, 14:20

PHP-Quelltext

1
2
3
4
// neues passwort generieren
$password rand(100000000000,100000000000000);
// datenbanktauglich verschlüsseln:
$password_md5 md5($password);

Kann man das so machen? Gibt es bessere Methoden, Zufalls-Kombinationen zu generieren (Vielleicht mit Zahlen & Buchstaben gemischt)?

15

Sonntag, 22. August 2004, 14:34

Bitte keine Diskussionen "anzetteln" die so direkt nix mit dem Beitrag zu tun haben. Ergo streifenkiste ... bitte neues Thema im PHP-Forum uffmachen :)
Danke ...
Signatur von »TheNobody Style«

16

Donnerstag, 2. September 2004, 22:50

Zitat von »mr_happiness«


vorgehensweise bei mir:
$code = md5(microtime());
$code in spalte user_activationcode
$code = md5($userid.$code);


Dazu habe ich mla noch Fragen.
Wieso wird hier die userid und die microtime ge md5t und dann wieder in code geschrieben?
Hast du Angst, dass jemand vielleicht weiß, dass du die microtime md5st und hängst deshalb nochmal die userid an, da die userid ja für die user wahrscheinlich nicht sichtbar ist?
Also hast duein Problem damit, dass quasi jemand während des Registrierungsprozesses auch
md5(microtime()) auf seinem server macht und sich selber einen Link bastelt zum freischaltet?
Das so etwas funktioniert ist meiner Meinung nach sehr unwahrscheinlich, da sich die microtime ja ständig ändert.
Signatur von »oop1« _________

17

Donnerstag, 2. September 2004, 22:55

richtig, ist nur paranoia :)
Signatur von »mrhappiness« Ich denke, also bin ich. Einige sind trotzdem...

18

Freitag, 3. September 2004, 16:43

clever, clever :D
Theoretisch könnte man aber auch eine Variable $secret nehmen und die z.B. mit WSB initialisieren.
Eine zweite Variable könnte man $temp nennen und ihr die emailadresse und die Variable secret mit Punktoperator zuweisen (Beide Variablen aneinanderhängen).
Dann ruft man die MD5 Funktion auf und verschickt den Link.
Selbst wenn jemand so clever sein sollte und mit seinem PHP interpreter die MD5 funktion
mit seiner gefakten Emailadresse ausprobiert, wird er es wegen dem sting der in secret steht und mit ge md5t wird nicht schaffen sich freizuschalten.
Signatur von »oop1« _________

19

Donnerstag, 6. Januar 2005, 23:01

PHP-Quelltext

1
2
3
4
5
//Zusammenbasteln des SQL-Statements
$SQL='SELECT userid
FROM users
WHERE UserNick='.$_POST['nick']." AND UserPass=MD5('".$_POST['pass'].")'
LIMIT 1";


Hm.. SQL-Injektion? Das ganze müsste heißen

PHP-Quelltext

1
2
3
4
//Zusammenbasteln des SQL-Statements
$SQL='SELECT userid
FROM users
WHERE UserNick = "'.mysql_real_escape_string($_POST['nick']).'" AND UserPass=" '.md5($_POST['pass'])."' LIMIT 1';



Tobias
Signatur von »t-ob-i« {SIGNATUR}

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »t-ob-i« (6. Januar 2005, 23:03)


20

Freitag, 7. Januar 2005, 07:11

jaja, waren jugendsünden *g*
Signatur von »mrhappiness« Ich denke, also bin ich. Einige sind trotzdem...