![]() |
| | Themen-Optionen |
| | Nach oben #1 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.471
| Ein sessionbasiertes Loginsystem Irgendwann kommt man an den Punkt, an dem man gerne einen Bereich mit einem Passwort schützen möchte. Die Kombination von Sessions und einer Datenbank - in diesem Fall MySQL - ist dafür prädestiniert. Achtung: Dieses Tutorial gewährleistet keinerlei Sicherheit des Logins. Die Verwendung der hier vorgestellten Quelltext erfolgt auf eigene Gefahr. Aber jetzt mal zum Thema. Wir möchten also eine geheime Seite haben, die nur per Login erreicht werden kann. Wir brauchen also auf jeden Fall mal ein Loginformular. Fangen wir direkt einmal damit an. Die Datei enthält keinerlei PHP-Code, da dies nicht unbedingt nötig ist. Aus diesem Grunde habe ich der Datei auch die Endung .html gegeben. Das kann natürlich je nach Bedarf geändert werden. Code: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Login</title>
</head>
<body>
<h1>Loginformular</h1>
<form action="validateLogin.inc.php" method="post">
<input type="text" name="username">
<input type="password" name="passwort">
<input type="submit" name="login" value="Einloggen">
</form>
</body>
</html>
Schauen wir uns also diese Datei etwas näher an. Die Datei validateLogin.inc.php - das Kernstück des Logins Hier passiert relativ viel. Da wird mit Sessions arbeiten müssen wird zunächst einmal die Session starten. PHP-Code: Unser Nutzerdaten sind in einer Datenbank gespeichert. Erst wenn wir sicher sind, dass der Nutzer die Angaben komplett gemacht hat erstellen wir eine Verbindung zur Datenbank. Dazu binden wir eine Konfigurationsdatei ein, die die Zugangsdaten zur Datenbank enthält. Danach erstellen wir die Verbindung. PHP-Code: Den Datensatz identifizieren wir durch die Kombination aus Usernamen und Passwort. Das Passwort steht aus Sicherheitsgründen nicht im Klartext in der Datenbank, sondern als md5-Verschlüsselung. PHP-Code: Sollte aus unvorhersehbaren Gründen mehr als einen selektierten Datensatz geben brechen wir den Login aus Sicherheitsgründen ab. Je nach Bedarf kann man sich für diesen Spezialfall noch etwas individuelles ausdenken. Wir fassen nun diese beiden Fälle allerdings zusammen. PHP-Code: Viel interessanter ist der Erfolgsfall. Der User hat sich also mit seinen richtigen Daten angemeldet. Der Login ist also erfolgreich. In diesem Fall wird die Session mit Informationen gefüllt. Als wichtigste Handlung wird die Variale $_SESSION['loggendIn'] auf true gesetzt. So kann der User im passwortgesicherten Bereich als eingeloggt identifiziert werden. PHP-Code: PHP-Code: PHP-Code: PHP-Code: Kommen wir nun zu den restlichen Dateien, die uns noch fehlen, um ein geschlossenes System zu erhalten. Zunächst trage ich noch die Datei "loginfehler.html" nach. Code: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Fehler beim Login</title>
<meta http-equiv="refresh" content="5; URL=http://localhost/loginformular.html">
</head>
<body>
<h1>Es ist ein Fehler beim Login aufgetreten.</h1>
<p>Eventuell handelt es sich nur um einen Tippfehler. Bitte versuchen Sie es nochmals.</p>
Sie werden nach von 5 Sekunden automatisch weitergeleitet.
</body>
</html>
Dann wurde oben natürlich schon die Datei "geheim.php" verwendet. Da wird der User nach dem Login ja hingeleitet. Diese Datei bindet ganz zu Beginn eine weitere Datei ein. PHP-Code: Die Datei "checkLogin.inc.php" macht nur eine einzige Sache. Sie überprüft, ob die Session-Variable $_SESSION['loggendIn'] mit true belegt ist oder nicht. Ist dies nicht der Fall, so wird der User zum Loginformular geschickt, da er ja nicht eingeloggt ist. Somit ist sichergestellt, dass nur eingeloggte User die Seite "geheim.php" zu sehen bekommen. Die Datei "checkLogin.inc.php" sieht somit folgendermaßen aus: PHP-Code: Aber nochmal zurück zur Datei "geheim.php". In diesem Tutorial ist da natürlich nichts interessantes zu sehen. Es geht ja nur um das Prinzip. Allerdings erkennt man am Ende der Datei noch eine sehr wichtige und oft vergessene Funktionalität - den Logout. Klickt man auf den Link, so wird die Datei "logout.php" aufgerufen PHP-Code: Ich persönlich sehe das nicht so. Ich setze einfach die Variable $_SESSION['loggedIn'] auf false. Dadurch wird abgesichert, dass der User nach dem Logout nicht mehr in den geschützen Bereich kann (das wird ja durch die Datei "checkLogin.inc.php" gewährleistet!) und die Session kann trotzdem noch weiterverwendet werden. Sinnvoll wäre es natürlich alle Session-Variablen, die irgendwas mit dem geschützten Bereich zu tun haben zu löschen. Aber es können sich ja auch andere Daten in der Session befinden. Das kann aber jeder für sich individuell entscheiden. Ich möchte hier noch auf den nächsten Beitrag verweisen. Dort findet man noch einmal alle Dateien mit komplettem Quelltext und zusätzlich einen SQL-Export, so dass man das Tutorial direkt testen kann. Ich denke, dass man mit diesem Tutorial einen guten Einblick in das prinzipielle Vorgehen bei einem Login gewinnen kann. Ich wünsche viel Spaß und Erfolg beim Basteln Solltet Ihr Fragen zu dem Tutorial haben, so schreibt bitte einen Beitrag im Forum für Allgemeine PHP-Programmierung mit einem Verweis auf dieses Tutorial. Danke. Geändert von Ben (02.03.2007 um 14:46 Uhr). |
| | |
| | Nach oben #2 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.471
| loginformular.html Code: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Login</title>
</head>
<body>
<h1>Loginformular</h1>
<form action="validateLogin.inc.php" method="post">
<input type="text" name="username">
<input type="password" name="passwort">
<input type="submit" name="login" value="Einloggen">
</form>
</body>
</html>
PHP-Code: Code: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Fehler beim Login</title>
<meta http-equiv="refresh" content="5; URL=http://localhost/loginformular.html">
</head>
<body>
<h1>Es ist ein Fehler beim Login aufgetreten.</h1>
<p>Eventuell handelt es sich nur um einen Tippfehler. Bitte versuchen Sie es nochmals.</p>
Sie werden nach von 5 Sekunden automatisch weitergeleitet.
</body>
</html>
geheim.php PHP-Code: PHP-Code: logout.php PHP-Code: SQL-Export Code: # # Table structure for table `archiv_login` # CREATE TABLE `archiv_login` ( `_id` int(4) NOT NULL auto_increment, `_username` varchar(50) NOT NULL default '', `_passwort` varchar(35) NOT NULL default '', `_anzahlLogins` int(7) NOT NULL default '1', PRIMARY KEY (`_id`), KEY `_username` (`_username`) ) TYPE=MyISAM AUTO_INCREMENT=3 ; # # Dumping data for table `archiv_login` # INSERT INTO `archiv_login` (`_id`, `_username`, `_passwort`, `_anzahlLogins`) VALUES (1, 'Ben', '098f6bcd4621d373cade4e832627b4f6', 3), (2, 'FreundVomBen', '598d4c200461b81522a3328565c25f7c', 3); Code: Ben -> test FreundVomBen -> hallo // edit by supertramp: 13.05.2005: Fehler in checkLogin.inc.php verbessert. |
| | |
| | Nach oben #3 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.471
|
Hallo, ich wurde kürzlich gefragt, wie denn die Datei config.inc.php auszusehen hat. Gute Frage .. vor allem für PHP-Einsteiger. Die Datei, die ich in diesem Fall verwende sieht im Prinzip folgendermaßen aus. PHP-Code: Ich hoffe, dass ich auch dieses Problemchen wenigstens zu 90% mit Euch zusammen lösen konnte. Geändert von Jann Hendrik (28.05.2008 um 19:46 Uhr). Grund: link aktualisiert |
| | |
| | Nach oben #4 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.471
|
Hallo, da ich öfters mal gefragt werde, wie man das Login-Script so erweitern kann, dass sich auch User anmelden können ... schreibe ich hier mal ein paar Gedanken dazu auf. Zunächst brauchen wir natürlich wieder mal ein Formular mit zumindest mal einem, im Normalfall aber zwei Eingabefeldern und einem Button, der das Formular abschickt. Also irgendwie so: HTML-Code: <form action="register.php" method="post"> <!-- Beschriftungen und Formatierungen lasse ich hier bewusst entfallen --> <input type="text" name="username" size="20" /> <input type="text" name="password" size="20" /> <input type="submit" name="submit" value="anmelden" /> </form> Als nächsten Schritt gehen wir die Datei register.php an. Im oben skizzierten Formular sehen wir ja, dass der POST-Request, also "die Daten aus dem Formular", an diese Datei gesendet werden (mal etwas grob gesprochen Was muss diese Datei können? Ahja, stimmt .. diese Datei muss den User, der sich registrieren will ja irgendwie in der Datenbanktabelle abspeichern, damit er beim Login bzw. der Datei validateLogin.inc.php (siehe oben) auch als registrierter User erkannt wird. Generell ist das ja auch kein Problem. MySQL ist ja bekanntlich sehr anwenderfreundlich und so finden wir im MySQL-Handbuch (deutsche Version) heraus, dass man Datensätze mit INSERT einer Datenbanktabelle hinzufügen kann. Super. Dann machen wir das doch einfach mal. PHP-Code: Bitte sorgt dafür, dass die SQL-Statements so geprüft werden, dass potentielle Gefahren wie SQL-Injection vermieden werden. Bitte lest diesen Thread und lernt mit den dort beschriebenen Tipps Jou. Also weiter im Text. Obiger "Code" hat allerings einen Haken. Er geht davon aus, dass niemals zwei User den selben Usernamen haben möchten. Da davon aber nicht ausgegangen werden darf müssen wir das vorher abfangen. Wir überprüfen also, ob der Usernamen, den der sich registrierende User haben möchte, schon vergeben ist oder ob er sich mit dem Namen anmelden kann. Wie kann man das jetzt machen? Ganz einfach. Wir haben so eine Abfrage schon einmal verwendet und zwar in der Datei validateLogin.inc.php. Dort überprüfen wir ja auch, ob der User existiert. Wenn das der Fall und sogar das Passwort korrekt ist, dann lassen wir ihn sich einloggen. Hier bauen wir das jetzt etwas um. Existiert der Username schon, so ist das ja kein "Erfolg", sondern der User muss sich einen anderne Namen ausdenken. Ich lasse an dieser Stelle bewusst die Codepassage weg, da ich der Ansicht bin, dass man wenigstens ein klein wenig denken sollte, wenn man dieses Tutorial und dieses Update verwenden möchte. Niemand von euch ist so dumm, dass er das nicht hinbekommen würde. Als Tipp kann ich nur sagen, dass es zwei Möglichkeiten gibt herauszufinden wie viele Datensätze eine SQL-Abfrage erbracht hat.
Dazu noch eine if-Abfrage, in der überprüft wird, ob es mehr als 0 Datensätze sind und wenn das nicht der Fall ist, dann wird der oben beschriebene INSERT-"Befehl" ausgeführt .. mysql_query() und mysql_error() kennt ihr ja bereits Ich habe das hier jetzt nicht getestet - es gibt ja auch nicht wirklich was zu testen - aber vom Prinzip her funktioniert das wunderbar *g* Probiert es aus und verzweifelt nicht, wenn es mal länger als 30 Minuten dauert. Für Fragen stehen wir (die Mitglieder dieses Forums) generell und ständig zur Verfügung. Eine Anmeldung und eine gut gestellte Frage reichen da oftmals aus. Hoffe, dass das hier dem ein oder anderen weiterhilft. Grüße Ben. Geändert von Jann Hendrik (28.05.2008 um 19:47 Uhr). Grund: link aktualisiert |
| | |
| | Nach oben #6 | ||
| Neuer Benutzer Registriert seit: 18.08.2005
Beiträge: 28
| Zitat:
Zitat:
Weiter hab ich mir das Ding nicht angesehen. | ||
| | |
| | Nach oben #7 |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.471
|
Cleverle .. das ist doch nur eine Struktur. Thread dazu gibt es hier: Geändert von Jann Hendrik (28.05.2008 um 19:47 Uhr). Grund: link aktualisiert |
| | |
| | Nach oben #9 | |
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.471
|
Hallo, Zitat:
Danke für die Kritik. Grüße Ben. PS: Sehr gute Ausführung zur Verwendung von Datenbanken im Allgemeinen und der Verbindung MySQL und PHP Geändert von Ben (13.11.2005 um 15:54 Uhr). | |
| | |
| | Nach oben #10 |
| n00b -.- Registriert seit: 10.11.2005
Beiträge: 318
|
Naja... Also, ich hatte schon am Rande mit MySQL zu tun und wüsste jetzt, was ich mit dem Quelltext tun müsste. Aber viele Anfänger vermutlich nicht. Also vll ne Empfehlung zu MySQL-Admintools? Und dann noch zeigen, wo Passwort und Benutzername verändert werden. |
| | |
| | Nach oben #11 | ||
| Benjamin Klaile Registriert seit: 02.12.2004 Ort: Remagen
Beiträge: 4.471
|
Hi, danke für die Hinweise. Zitat:
Ich denke mal, dass da eher der Support oder die FAQ des Hosters durchsucht werden sollten. Wenn jemand Interesse daran hat einige Kritiken und Erfahrungsberichte zu MySQL-Administrations-Tools zu schreiben, dann erbitte ich eine Kontaktaufnahme per PN. Zitat:
Oder habe ich dich da falsch verstanden? Grüße Ben. Geändert von Jann Hendrik (28.05.2008 um 19:48 Uhr). Grund: link aktualisiert | ||
| | |
| | Nach oben # |