Einfaches Login-System in PHP

Ich habe ein kleines und einfaches Login-Script in PHP geschrieben, welches mehrere Benutzer unterstützt und ohne Datenbank (ohne MySQL) funktioniert. Das auf Sessions basierende System möchte ich hier in Form eines Tutorials vorstellen.

Hinweis zu Version 2.0

Im Download-Bereich wird nun eine überarbeitete Version des Login-Scripts angeboten, in der diverse Bugs – siehe Komentare – behoben wurden – darunter der fehlende Wert in $_SESSION['usr'], Status-Prüfung in private.php und einige Formalitäten. Ich empfehle den Download des Scripts, da in der Web-Version Formatierungsprobleme auftreten können. Ich übernehme für die Funktionalität und Sicherheit des Scripts keine Verantwortung. Verwendung auf eigene Gefahr. Das Script ist für einen echten Produktiveinsatz nicht gedacht.

Das Login-Script besteht aus Anmeldeformular, Anmeldenscript, Abmeldescript, sowie den durch die Benutzer-Verifikation geschützten Seiten. Es unterstützt ein Mehrbenutzersystem und MD5-Verschlüsselung der Passwörter. Der Anwendungsbereich für das Script ist ähnlich dem Schützen mehrerer Dateien oder Ordner durch einen .htaccess-Datei mit .htpasswd-Erweiterung.

Tutorial

Das nachfolgende Tutorial beschreibt eine Schritt-für-Schritt Anleitung zur Einbindung eines Loginsystems in eine Website.

Anmeldeformular

Das Formular für die Eingabe der Benutzerdaten besteht aus HTML und sollte in der Datei login.html stehen. Es enthält drei Eingabefelder:

  1. Benutzername mit name-Attribut “user”
  2. Passwort (Typ: password) mit name-Attribut “password”
  3. Abschicken-Button (Typ: submit) mit name-Attribut “login”

Das action-Attribut des form-Tags sollte auf die Datei login.php verweisen und die Übertragungsmethode POST sein. Ein Beispiel für eine funktionierende login.html-Datei (bei Download enthalten) lautet:

<!doctype html>

<meta name="content-type" content="text/html; charset=utf-8" />

		<!-- START OF LOGIN-FORM --></pre>
<form action="login.php" method="post">
<label><input type="text" name="user" /> Benutzername</label>

<label><input type="password" name="password" /> Passwort</label>

<label><input type="submit" name="login" value="Anmelden" /></label>

</form>
<pre>

		<!-- END OF LOGIN-FORM -->

	

Anmeldescript

Das Anmeldescript besteht aus einem PHP-Code und verarbeitet die vom Formular abgeschickten Daten:

  • Überprüfung der Daten
  • Ausgabe der Fehler
  • Bestätigung des Users
<?php

/*** KONFIGURATION ***/

// Definiert Konstanten für das Script
define('MD5_ENCRYPT', false); // Aktiviert Verschlüsselung für Passwort. Wenn "true" gesetzt, müssen Passwörter von $usrdata md5-verschlüsselt vorliegen. Standard: false
define('SUCCESS_URL', 'private.php'); // URL, zu welcher nach erfolgreichen Login umgeleitet wird.
define('LOGIN_FORM_URL', 'login.html'); // URL mit Anmeldeformular
// Array mit Benutzerdaten: Besteht aus Array-Elementen mit paarweisen Benutzernamen und Passwörtern
$usrdata = array(

	array(
		"usr" => "admin",
		"pwd" => "passwort" // MD5-verschlüsselte Form: e22a63fb76874c99488435f26b117e37
	),
	array(
		"usr" => "benutzername_fur_person",
		"pwd" => "passwort_fur_person"
	)
	/* ... */
);

header("Content-Type: text/html; charset=utf-8"); // Melde Browser die verwendete Zeichenkodierung

// PHP-Session starten und aktuellen Stand abfragen
session_start();
$_SESSION['logged_in'] = (isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true) ? true : false;
$_SESSION['usr'] = (isset($_SESSION['usr'])) ? $_SESSION['usr'] : '';

$error = array();
if(!isset($_POST['login'])){
	header('Location: '.LOGIN_FORM_URL);
}else{
	$usr = (!empty($_POST['user']) && trim($_POST['user']) != '') ? $_POST['user'] : false;
	$pwd = (!empty($_POST['password']) && trim($_POST['password']) != '') ? $_POST['password'] : false;

	if(!$usr || !$pwd){
		if(count($error) == 0)
			$error[] = "Bitte geben Sie Benutzername und Passwort ein.";
	}else{
		$pwd = (MD5_ENCRYPT === true) ? md5($pwd) : $pwd; // Passwort eingabe MD5-encrypten, falls Option gesetzt ist
		foreach($usrdata as $ud){ // Benutzer-Liste durchlaufen und je mit Formular-Eingaben vergleichen
			if($usr != $ud['usr'] || $pwd != $ud['pwd']){
				if(count($error) == 0)
					$error[] = "Benutzername und/oder Passwort nicht korrekt.";
			}else{
				$_SESSION['logged_in'] = true;
				$_SESSION['usr'] = $usr;
				header('Location: '.SUCCESS_URL);
			}
		}
	}
}

?><!doctype html>
<html>
	<head>
		<meta name="content-type" content="text/html; charset=utf-8" />
		<title>Login-Fehler</title>
	</head>
	<body>
		<ul>
		<?php
		foreach($error as $out){
			?>
			<li><?php echo $out; ?></li>
			<?php
		}
		?>
		</ul>
		<p><a href="<?php echo LOGIN_FORM_URL; ?>">Zur Anmeldeseite</a></p>
	</body>
</html>

Die Konstanten/Variablen MD5_ENCRYPT, SUCCESS_URL, LOGIN_FORM_URL und $usrdata können auf Ihre Anforderungen eingestellt werden:

Variable Beschreibung
MD5_ENCRYPT Mögliche Werte sind true oder false; Bestimmt, ob Benutzerpasswörter MD5-verschlüsselt (true) vorliegen oder in Klartext (false); Standard: false
SUCCESS_URL Relativer oder absoluter Pfad zur Seite, welche nach erfolgreicher Anmeldung angezeigt werden soll; Standard: private.php
LOGIN_FORM_URL Relativer oder absoluter Pfad zur Seite, welche das Anmeldeformular enthält; Standard: login.html
$usrdata Mehrdimensionales Array, welches die Daten aller Benutzer enthält; Erste Dimension: einzelne Benutzer; Zweite Dimension: Indize usr (für Benutzername) und pwd(für Passwort); Beispiel:
$usrdata =array(
    array(
        "usr" => "admin",
        "pwd" => "passwort"
    ),
    array(
        "usr" => "benutzer",
        "pwd" => "abc123-passwort"
    )
);

Wenn Sie die MD5-Verschlüsselungsfunktion nutzen möchten, verschlüsseln Sie die Passwörter aller Nutzer erst mit einem Generator und setzen Sie den entstehenden Hash in $usrdata=>pwd ein. » MD5-Hash-Generator by vlBlog

Abmeldescript

Der PHP-Code zum Abmelden sollte in der Datei logout.php stehen. Er bewirkt die Löschung der aktuellen Session eines Benutzers. Sobald ein angemeldeter Benutzer die Datei aufruft, ist er abgemeldet.

<?php
session_start();
$_SESSION['logged_in'] = false;
$_SESSION['usr'] = '';
header("Location: login.html");
?>

Geschützte Seite

Um Seiten und Dateien durch das Anmeldesystem zu schützen, muss lediglich ein kurzer PHP-Code an den Beginn jeder zu schützenden Seite (mit *.php-Endung) eingefügt werden:

<?php
session_start();
if(!$_SESSION['logged_in'])
	header("Location: login.html");
	exit;
?>

Sollte der Benutzer nicht angemeldet sein, so wird er zum Anmeldeformular weitergeleitet. Nach diesem Code kann jeglicher Inhalt in HTML stehen.

Beispiel:

<?php
session_start();
if(!$_SESSION['logged_in'])
	header("Location: login.html");
	exit;
?><!doctype html>
<html>
	<head>
		<meta name="content-type" content="text/html; charset=utf-8" />
		<title>Privater Bereich</title>
	</head>
	<body>
		<h1>Willkommen <?php echo $_SESSION['usr']; ?>!</h1>
		<h2>Sie haben sich erfolgreich angemeldet.</h2>
		<p>Dies ist der passwortgeschützte Bereich Ihrer Website.</p>
		<p><a href="logout.php">Melden sie sich wieder ab.</a></p>
	</body>
</html>

Schnelle Installation

Die Installationsanleitung ist ebenfalls in der datei liessmich.txt

  1. Entpacken Sie die Dateien des ZIP-komprimierten Ordners auf eine Festplatte
  2. Öffnen Sie die Datei “login.php” mit einem Editor (z.B. Notepad++ ||| nicht Windows Editor oder Wordpad!) und bearbeiten Sie die Zeilen 10 – 23:
    1. Der in MD5_ENCRYPT enthaltene Wert (Zeile 10) sollte auf false gesetzt sein, wenn die Passwörter nicht MD5-verschlüsselt vorliegen.
    2. Die Konstante SUCCESS_URL (Zeile 11) enthält den Dateinamen der Seite, welche nach erfolgreicher Anmeldung angezeigt werden soll.
    3. Die Konstante LOGIN_FORM_URL (Zeile 12) enthält den Dateinamen der Seite, welche das Anmelde-/Loginformular beinhaltet.
    4. Die Variable $usrdata (Zeile 13) enthält ein PHP-Array, dessen Werte Arrays mit den Indizen “usr” (für Benutzernamen) und “pwd” (für Passwort) umfasst. Orientieren Sie sich an den enthaltenen Beispielen der Datei “login.php”.
  3. Laden Sie die entpackten und bearbeiteten Dateien auf einen PHP-fähigen Webspace und öffnen Sie unter Ihrer Domain die Datei “login.html”. Melden Sie sich im erscheinenden HTML-Formular mit den in “login.php” gespeicherten Benutzerdaten an.
  4. Fertig! Sie können weitere passwortgeschützte Seiten erstellen, indem Sie den Inhalt der Datei “private.php” kopieren, in andere PHP-Dateien einfügen und die anzuzeigenden Inhalte und HTML-Codes verändern.
  5. Es können ebenfalls Stylesheets für Design- und Layoutmittel eingesetzt werden.

Zusatz für benutzer-spezifische Ziel-Seiten

Für eine Weiterleitung auf benutzername_private.php siehe den Kommentar von Michael: Login-Zusatz für Benutzer-Seiten

Download

Die aktuelle, zusammengefasste Version des Login-Scripts ist ZIP-verpackt zum Herunterladen verfügbar:

VL-SimpleLogin-2.0

Für Infos zu den Neuerungen in Version zwei, siehe Hinweise oben.

Ich wünsche viel Spaß!

Dieser Artikel wurde vertaggt mit , , , , , , , , .
Kategorien: PHP, Tutorial, Webdesign

Hat Ihnen dieser Artikel gefallen? - Dann abonnieren Sie vlblog um über neue Themen rund ums Web informiert zu werden.

36 Kommentare zu “Einfaches Login-System in PHP”

  1. Gert H. Schlenker sagt:

    Im Gegensatz zu einem .htaccess-Zugriffsschutz wird doch das Lesen der Seiten (durch einfaches Eintragen der URI beim Browser) nicht verhindert! Insbesondere können also robots die Seiten auffinden und auslesen!

    • Vitus Lehner sagt:

      Man kann die URL zwar Aufrufen, aber man wird keinen Inhalt angezeigt bekommen, der durch obigen PHP-Code geschützt ist. Einen ganzen Verzeichnisschutz bietet dieses Script nicht, aber für den Schutz von Inhalten einer HTML- bzw. PHP-Datei ist das Script geeignet.

  2. NO Checker sagt:

    Hää brauch man nicht noch eine Register Script?

    • vitus37 sagt:

      Das ganze ist ein Login-Script für einen privaten Bereich. Vom Nutzen her vergleichbar mit einem .htaccess-Verzeichnisschutz. Eine Registrierung ist nicht möglich. Benutzer werden vom Administrator per Hand im $usrdata-Array hinzugefügt.

  3. Felix sagt:

    Hallo,
    ich finde die Programmierungen gut, aber eine klappt bei mir nicht :-(
    es ist der “Anmeldescript”
    ich fände es schön wenn sie es mal selber ausprobieren und wenn´s falsch ist dann verbessern wenn nich werde ich nicht sterben :-)

  4. Michael sagt:

    Kann man das Script auch so gestallten dass jeder User auf eine Ihm zugeschnittene Seite gelangt? Also User1 logt sich mit Benutzername und Passwort ein, gelangt zu Seite 1, User2 mit seinen Daten gelangt zu Seite 2, User3 mit seinen Daten zu Seite 4 usw.

    • vitus37 sagt:

      Ja, das sollte möglich sein.
      Ändere in login.php die Zeile mit header("Location: ".$loc); zu header("Location: ".$ud['usr'].'_'.$loc);. Dann werden Benutzer auf die Seite benutzername_private.php umgeleitet.

      Zu beachten ist dabei, dass in der xxx_private.php dann nicht nur geprüft werden muss, ob der Benutzer eingeloggt ist, sondern auch, ob er der korrekte Benutzer ist.

      if(!$_SESSION['logged_in'] || $_SESSION['usr'] !== 'benutzername'){
      header("Location: login.html");
      exit;
      }

    • harald sagt:

      Hi, wirklich klasse Skript. Danke dafür!
      Aber leider wird bei mir auch noch keine Wert für $_SESSION['usr'] ausgegeben. Kannst du die nötige Änderung nochmal posten?
      Danke & Gruß

  5. André sagt:

    Super Skript, vielen Dank!

    Leider wird mir, wenn ich eingeloggt bin mit echo $_SESSION['usr'] nicht der Benutzer angezeigt sondern nur ein leerer Wert.
    Wo kann da dass Problem liegen?

    MfG
    André

    • vitus37 sagt:

      Dies schien ein kleiner Bug zu sein. Ich habe den Code an einer entsprechenden Stelle ausgebessert. Vielen Dank für deinen Hinweis!

  6. Hallo,

    habe das LOGIN verarbeitet – funktioniert sehr gut.
    Habe dazu benutzt, um einen SHOP zu schützen.
    Da es ein Company zu Company Shop ist, ist der Schutz nicht ganz so wichtig.

    Am ende meiner Shop Prozedure gebe ich eine Mail an den besteller weiter, und würde gerne den USER der eingeloggt ware mitandrucken.

    Geht das?
    Danke.

    lg
    Gregor

  7. Lukas sagt:

    hallo ich finde es toll dass du deine Arbeit hier veröffentlichst! Es wäre nett wenn du noch einmal zeigen könntest was man ändern müsste, um den Benutzer auf eine zugeschnittene Seite zu leiten.

    Ich finde den Befehl header(“Location: “.$loc); den man ändern soll in der Login.php Datei nicht.

    Mfg
    Lukas

    • knoepfchen sagt:

      Ich habe jetzt ne umgeschreibene version aber hier ist der code wenn du das mit den webseiten machen willst in Z.64 must das stehen: header(‘Location: ‘.$ud['usr'].’_’.SUCCESS_URL);

  8. Jan sagt:

    Hallo Vitus
    Tolles Script- das erste was wirklich funktioniert.

    Doch habe ich einen kleinen Fehler bemerkt.

    Man kann den Login umgehen, indem man direkt private.php eingibt.

    Währe nicht in dem Fall eine Weiterleitung zur Seite Login.html besser, damit der Zugriff erst möglich ist, wenn das Passwort und der Benutzername eingegeben sind.

    Vielen Dank nochmal

    LG Jan

  9. Stephan sagt:

    Hallo, danke für das Skript. Nach soetwas habe ich schon länger gesucht.

    Trotzdem gibt es Probleme: Wenn ich eingeloggt bin funktioniert echo $_SESSION['usr'] nicht, das heisst es wird der Benutzername nicht angezeigt. An welcher Stelle wurde der Code denn ausgebessert?

    Ausserdem wollte ich das Script gerne für mehrere Benutzer umbauen aber
    if(!$_SESSION['logged_in'] || $_SESSION['usr'] !== ‘benutzername’){
    header(“Location: login.html”);
    exit;
    }
    leitet mich immer wieder auf die login.html anstatt auf die Benutzerseite. Was läuft denn da falsch?

  10. Gernot sagt:

    Ich habe das Script ebenfalls gerade ausprobiert und finde es sehr praktisch.
    Leider aber immer noch der Bug mit echo $_SESSION['usr'] im Download-File. Es wäre angenehm zu wissen, was man da noch ändern muss, dass die Ansprache läuft.
    Vielen Dank im Voraus.

  11. William sagt:

    Hey, sag mal kann man den Benutzernamen auch verschlüsseln? Was muss ich da im Script ändern? Grüße.

  12. Andreas sagt:

    Tolles Skript!
    Leider wird auch mir weiterhin nach dem Einloggen der Benutzer nicht angezeigt sondern lediglich “Willkommen” gefolgt von einem Leerzeichen und dem Ausrufezeichen.

    Gibt es hier zwischenzeitlich eine Lösung?

    Vielen Dank.
    Andreas

  13. AndreMertes sagt:

    Hallo.
    Ich habe mir diese Seite angeschaut, weil ich versucht habe, einen funktionierenden Login zu erstellen. Allerdings ist dies immer gescheitert.
    Dann bin ich hierher gekommen.: Ich versuchte, einen Login basiert auf diese Dateien zu erstellen, aber es funktionierte immer noch nicht.
    Ich würde mich über Hilfe sehr erfreuen.
    MFG Andre
    PS: Danke im Voraus ;)

  14. Prince sagt:

    Ihr seit alle liebendswerte Nerds!!! Danke für die Mühe :D

  15. Leo sagt:

    Woran kann es liegen, dass auf der Seite “private.php” der Name des Users () nicht angezeigt wird?

  16. Bernd sagt:

    Zu Anfrage von Michael:

    Ich habe die Änderung vorgenomme:
    Ändere in login.php die Zeile mit header(“Location: “.$loc); zu header(“Location: “.$ud['usr'].’_’.$loc);. Dann werden Benutzer auf die Seite benutzername_private.php umgeleitet.

    Leider findet der Browser die angegebene URL nicht Fehler 404

    MfG Bernd

  17. Andreas sagt:

    Genau danach habe ich lange gesucht. Habe php-Scripte von Codecanyon gekauft aber leider konnte ich keines zum laufen bringen alles zu kompliziert für Rookies ;-)

    Vielen Dank für dieses super Tutorial – das hat sofort funktioniert.

    Ich benutze die Funktion, die du für Michael beschrieben hast: benutzername_private.php
    Funktioniert auch genial!!

    Du hast noch beschrieben, dass geprüft werden muss ob der korrekte Benutzer eingeloggt ist. Diesen Code bekomme ich nicht implementiert. Kannst du dazu einen kompletten Beispielcode posten?

  18. Chris sagt:

    Wen ich ihren Quell code so wie er ist einfüge öffnet sich die private seite trozdem wen ich die adresse oben in der url zeile eingebe , wie kann ich das abändern

  19. Marcus Kaufhold sagt:

    Wirklich ein tolles Skript – vielen Dank. Ich habe jetzt am 06.02.2014 das zip heruntergeladen.

    Ist der Bug von Andre ausgebügel? Ich habe nämlich das gleiche Problem. Was muß denn da genau stehen?

    Tausend Dank!

    Marcus

  20. […] Login-Skript für meinen geschützten Bereich habe ich von vlmedia.de übernommen, vielen Dank […]

  21. Julius Herb sagt:

    Danke,
    das Script ist super.
    Habe es auch gleich auf meiner Seite verwendet.
    Weiter so!

  22. Medger Dankwart sagt:

    Der Script funktioniert prima. Danke für die Veröffentlichung.
    Frage:
    Toll währe es, wen das Login in soweit erweitert würde,das es mit einem Einmal Passwort funktionieren würde.
    Etwa so, aus einer Liste von x Passwörtern kann per Mail ein Passwort an den User Vergeben werden. Das Passwort ist aber nur 1x nutzbar.
    Ich suche so was für eine Download Seite.
    Das währe ein ganz toller Script.

  23. Steffen Butt sagt:

    Hallo.
    Das Login Script funktioniert wunderbar.
    Jedoch hab ich das Problem, dass wenn ich eine Seite schütze, mich dann anmelde, die geschützte Seite leer bleibt.

    Als wäre ich gar nicht eingeloggt. Bin ich nicht angemeldet werde ich auch zu meinem Login-Formular weitergeleitet.

    MfG Steffen

  24. ppt34 sagt:

    Wie fügt man weitere Benutzer hinzu? Könnten sie mir das anhand eines Beispiels erklären? Wäre sehr nett.

  25. Nicolas Matheisen sagt:

    Ich sitze im Unterricht und bekomme das f**k Script nicht zum laufen. Kann mir das einer Stück für Stück erklären? X(
    Danke im voraus
    Nicolas Matheisen

  26. Anette sagt:

    Hab’s gerade geladen, probiert, alles gut. Vielen Dank!

  27. Juljan sagt:

    Bei mir kommt immer die Fehlermeldung das ich das Passwort fasch eingebe

  28. Ano Nym sagt:

    Hallo, habe zufällig diese Seite gefunden, das Script geholt und getestet.
    Also ich muss sagen, bin zwar nur eine Laie, aber vollstens zufrieden.
    Vielen Dank mal an dieser Stelle ;-)

  29. Huber sagt:

    Hallo,
    vielen Dank für das schöne System.
    Auf meinem lokalen Linux-Server läuft es einwandfrei.
    Jetzt wollte ich das ganze bei Strato einbinden und da funktioniert es nichtmehr.
    Wenn ich falsche Anmeldedaten eingebe, kommt der Hinweis “Anmeldedaten falsch” – das ist soweit richtig.
    Wenn ich dann aber “echte” Daten eingebe, kommt nur die Meldung “Login-Fehler”.
    Woran kann dies liegen?

Hinterlasse eine Antwort