[PHP] Sicheres Loginsystem mit MySQL & SESSIONS

  • ./ Editiert: => 2 \.
    In dieser Anleitung geht es darum, wie ein einfaches jedoch sicheres Loginsystem
    mit MySQL und SESSIONS programmiert / gecodet wird.


    Bevor Wir mit der Anleitung loslegen, möchte ich die Vorraussetzungen auflisten;
    > Du musst die Grundlagen wie Variablen und Funktionen.. beherschen.
    > Du musst ein Webspace besitzen, was PHP und MySQL unterstützt.
    > Du musst eine MySQL Datenbank besitzen.
    > Du solltest lust und viel Zeit zum Lesen haben.


    Die Vorraussetzungen sind nun erfüllt und es kann los legen.


    Du benötigst für die Anleitung folgende Dateien, die du später für das Loginsystem auf dem Webspace hochladen musst.


    Die benötigten Dateien;

    Spoiler anzeigen
    > index.php
    Die Datei "index.php", wird bei jedem Webspace, falls kein manuelles Pfad zu einer Datei angegeben wurde,
    automatisch aufgerufen.
    Nehmen Wir als Beispiel Google. Wenn Wir "http://www.google.de" aufrufen, werden Wir eigentlich auf
    "http://www.google.de/index.php" weitergeleitet. Die "index.php" ist ohne eine übernommene Einstellung die
    Standart Datei, die immer aufgerufen wird.

    Spoiler anzeigen
    In dieser Datei kommt später unser Login Formular und Funktion.

    Spoiler anzeigen
    > home.php
    Die Datei "home.php", kann nur ein eingeloggter Benutzer aufrufen.
    Falls der Benutzer nicht eingeloggt ist, wird der Benutzer zurück auf die Datei/Seite "index.php" weitergeleitet.
    In dieser Datei/Seite, kann der Benutzer seine Statistik ansehen.

    Spoiler anzeigen
    > class.php
    Es gibt viele Methoden um ein Loginsystem zu programmieren / coden.
    Wir benutzen eine Methode, die für etwas fortgeschrittene ist, undzwar mit Klassen.
    In der "class.php", schreiben Wir die Klassen und Funktionen für die MySQL Verbindung.

    Spoiler anzeigen
    > logout.php
    Beim Aufrufen der Datei "logout.php", werden Wir den Spieler seine Session löschen, den Benutzer
    somit ausloggen und auf die Startseite (Loginformular) weiterleiten.

    Nun hast du die benötigten Dateien und Wir können mit dem Schreiben beginnen.


    Wir fangen mit den einfachsten an, undzwar mit der Datei "logout.php".
    Wir öffnen die Datei "logout.php" und schreiben zu erst den PHP Tag, damit unser Browser erkennt,
    dass Wir mit PHP beginnen.


    Dazu schreiben Wir folgendes in die Datei "logout.php" rein;

    PHP
    <?php
    
    
    ?>


    Nun weiß unser Browser, hier beginnt PHP. Alle Funktionen von PHP muss zwischen den PHP Tags rein.
    Da Wir mit Sessions arbeiten, müssen Wir eine Session starten, um es auch wieder zu löschen denn,
    wenn Wir eine Session starten, gillt diese Session solange, bis Wir unseren Browser geschlossen haben, auf unserer
    Seite.


    Dazu schreiben Wir folgendes zwischen den PHP Tags;

    PHP
    session_start();


    Nun haben Wir eine Session gestartet und müssen es auch wieder löschen, damit der Benutzer ausgeloggt wird.
    Dazu schreiben Wir folgendes zwischen den PHP Tags;

    PHP
    session_destroy();


    Nun haben Wir den Benutzer ausgeloggt. Damit der Benutzer nach dem Ausloggen, auf die Startseite weitergeleitet
    wird, schreiben Wir folgendes zwischen den PHP Tags;

    PHP
    header("Location: index.php");


    Nun haben Wir den Spieler ausgeloggt und leiten ihn auf die Datei/Seite "index.php".


    Mit dem Ausloggen sind Wir nun fertig.


    Nun öffnen Wir die Datei "class.php" und schreiben auch dort den PHP Tag.

    PHP
    <?php
    
    
    ?>


    Wir erstellen nun eine Klasse Namens "MySQL", dazu schreiben Wir folgendes zwischen den PHP Tags;

    PHP
    class MySQL
    {
    
    
    }


    Nun haben Wir eine Klasse, jedoch ohne Funktionen. Wir definieren zu erst die benötigten Informationen,
    was für eine MySQL Verbindung wichtig ist.

    PHP
    private $Hostname;
    	private $Username;
    	private $Password; 
    	private $Database;
    	private $SelectDB;


    Wir definieren diese Funktionen in der "privat" Methode, da Wir diese Variablen in der gesammten Klasse verwenden
    wollen.


    Nun haben Wir die Klasse für "MySQL", jedoch fehlt uns die Funktion.
    Um die Funktion zu erstellen, schreiben Wir folgendes in die Klasse;

    PHP
    public function MySQL($Hostname, $Username, $Password, $Database)
    	{
    
    
    	}


    Nun haben Wir auch die Funktion.
    Diese Funktion ist public, dies bedeutet, dass die Funktion auch außerhalb der Klasse verwendet werden kann.
    Wir wollen aber die MySQL Verbindung nur in der Klasse erlauben, dafür rufen Wir die Funktion "MySQLConnect"
    in der "MySQL" Funktion auf und definieren hier nochmals die Variablen, damit Wir sie auch in der "MySQLConnect"
    Funktion verwenden können;

    PHP
    $this->Hostname = $Hostname;
    			$this->Username = $Username;
    			$this->Password = $Password;
    			$this->Database = $Database; 
    
    			$this->MySQLConnect();


    Okey, Wir haben jetzt zwar paar Funktionen, jedoch können Wir keine MySQL Verbindung aufbauen.
    Für das Aufbauen einer MySQL Verbindung, brauchen Wir nun die Funktion "MySQLConnect", diese ist in der "privat" Methode,
    da Wir sie nicht außerhalb der Klasse aufrufen wollen.


    Um die Funktion zu erstellen, schreiben Wir nun folgendes unter der "MySQL" Funktion;

    PHP
    private function MySQLConnect()
    	{
    
    	}


    Und nun bauen Wir eine Verbindung auf, in dem Wir folgendes in die Funktion "MySQLConnect" schreiben;

    PHP
    $this->Connect = mysql_connect($this->Hostname, $this->Username, $this->Password);
    			$this->SelectDB = mysql_select_db($this->Database, $this->Connect);
    			if(!$this->Connect || !$this->SelectDB) 
    			{
    				die('MySQL Fehler ist aufgetreten!');
    			}


    Nun können Wir durch das Aufrufen der "MySQL" Klasse/Funktion, eine MySQL Verbindung aufbauen.


    Bevor Wir mit dem Loginsystem anfangen, benötigen Wir noch in der MySQL Datenbank, eine Tabelle wo die
    Benutzerdaten gespeichert sind.


    Ich benutze "NaviCat", da es übersichtlicher und schneller zu bedienen ist.
    Wir erstellen eine Tabelle mit folgender Struktur;

    Code
    id (int) = 11
    username (varchar) = 255
    password (varchar) = 255


    Nun können Wir einen Benutzer einfügen und später uns mit den Daten einloggen.
    Für das Loginsystem wechseln Wir nun in die Datei "index.php" und schreiben auch hier zu erst die
    PHP Tags;

    PHP
    <?php
    
    
    ?>

    .


    Wir includen die Datei "class.php", damit Wir die Funktionen aus der class.php auslesen können.
    Dazu schreiben Wir folgendes zwischen den PHP Tags;

    PHP
    require_once("class.php");


    Es gibt viele Methoden um eine Datei zu includen. Als Standart wird "include '';" verwendet,
    Wir verwenden "require_once('');". Der Unterschied ist, dass bei "require_once('');" die Datei die Wir includen,
    vorhanden MUSS und falls nicht, gibt der Browser / Server uns eine Fehlermeldung aus.


    Nun starten wir eine Session für den Benutzer;

    PHP
    session_start();


    Und bauen eine Verbindung zu unserer MySQL Datenbank;

    PHP
    $MySQLConnect = new MySQL('localhost', 'root', 'passwort', 'datenbank');


    Nun überprüfen Wir ob das Loginformular abgesendet wurde, dies geht wie folgt;

    PHP
    if(isset($_POST['submit']))
    	{
    
    	}


    Nun überprüfen Wir zwar ob das Formular abgesendet wurde, jedoch fehlt uns noch das Überprüfen der Benutzerdaten.
    Dazu definieren Wir erstmal folgende Variablen, für den Benutzernamen und Passwort;

    PHP
    $Username = mysql_real_escape_string($_POST['username']);
    		$Password = mysql_real_escape_string($_POST['password']);


    Wir escapen die Variablen, um bestimmte Sicherheitslücken zu decken.
    Nun definieren Wir einen Query, damit Wir später Abfragen können, ob die Daten stimmen.
    Dies funktioniert wird folgt;

    PHP
    $CheckAcc = mysql_query("SELECT id FROM user_tabelle WHERE username = '$Username' AND password = '$password' LIMIT 1");


    Mit dieser Query tun Wir folgendes;

    Code
    Wir suchen in der MySQL Tabelle "user_tabelle" nach einer Spalte die eine ID, den Benutzernamen und Passworts der Eingegebenen Daten.
    Falls der Server eine Spalte findet, der den Benutzernamen und Passwort hat, den Wir eingegeben haben,
    wollen Wir, dass der Server den Benutzer einloggt und eine Session für diesen setzt, falls nicht, geben wir eine
    Fehlermeldung aus, dass die Daten nicht stimmen.


    Dies funktioniert wird folgt;

    PHP
    if(mysql_num_rows($CheckAcc) == 1)
    		{
    			// Der Benutzer hat richtige Daten angegeben..
    		} else {
    			// Der Benutzer hat falsche Daten angegeben..
    		}


    Nun überprüfen Wir, ob der Benutzer richtige Daten angegeben hat, falls ja, tun wir folgendes;

    PHP
    $_SESSION['username'] = $Username;
    			header("Location: home.php");


    Wir setzen eine Session für den Benutzer, und leiten den Benutzer auf die "home.php".
    Falls der Benutzer falsche Daten angegeben hat, geben wir ihn eine Fehlermeldung aus;

    PHP
    echo 'Die angegebenen Benutzerdaten, scheinen nicht korrekt zu sein!';


    Was ich noch vergessen habe, wir fügen unter

    PHP
    require_once("class.php");


    Eine Zeile, was überprüft, ob der Benutzer schon bereits eingeloggt ist, falls ja, leiten wir sie vor dem Einloggen
    noch auf die "home.php".

    PHP
    if(isset($_SESSION['username'])) { header("Location: home.php"); }


    Wir brauchen noch ein Formular, den wir den Benutzer zeigen, damit der Benutzer sich einloggen kann.
    Dies machen wir mit HTML, also schreiben wir UNTER den PHP Tags;


    Nun kann der Spieler sich einloggen, jetzt wechseln wir in die Datei "home.php", und starten auch dort den
    PHP Tag;

    PHP
    <?php
    
    
    ?>


    Wir includen auch hier die Datei class.php;

    PHP
    require_once("class.php");


    Nun starten wir auch hier die Session für den Benutzen;

    PHP
    session_start();


    Nun überprüfen Wir, ob der Benutzer eingeloggt ist, falls nicht, leiten wir den Benutzer zum Loginformular;

    PHP
    if(!isset($_SESSION['username'])) { header("Location: index.php"); }


    Ist der Spieler jedoch eingeloggt, geben wir den Benutzer seine Daten aus.
    Dafür schreiben Wir folgendes;

    PHP
    $PlayerInfo = mysql_fetch_object(mysql_query("SELECT * FROM user_tabelle WHERE username = '".$_SESSION['username']."' LIMIT 1");


    Nun sind wir auch schon fast am Ende der Anleitung.
    Wir schreiben UNTER den PHP Tags nun unseren HTML Teil;

    PHP
    <html>
    	<head>
    		<title>Willkommen, <?php echo $PlayerInfo->username; ?></title>
    	</head>
    	<body>
    		Willkommen, <?php echo $PlayerInfo->username; ?><br />
    		<a href="logout.php">Ausloggen</a>
    	</body>
    </html>


    Wir können mit der Funktion...

    PHP
    <?php echo $PlayerInfo->Feld; ?>


    ...bestimmte Felder (Informationen) des eingeloggten Spielers auslesen/ausgeben.


    Nun haben wir ein kleines Loginsystem, was auf MySQL und Sessions basiert.
    Fragen und Probleme können gerne im Thread geschrieben werden.
    Ein Feedback, Kritik oder Verbesserungsvorschlag, währe auch erwünscht.


    Ich hoffe ich könnte den meisten hier helfen.


    #Peace.

    2 Mal editiert, zuletzt von Backspace ()

  • Hi,


    Sieht nicht schlecht aus,
    nur eine Frage:


    Wenn du die prozedualen mysql_.... Funktionen in eine Klasse wrappst.
    Warum nicht direkt die mysqli Klasse? :)

    Weil die Funktion für die Verbindung "privat" bleiben soll.
    Das heißt, dass die Funktion nur in der Klasse "MySQL" aufgerufen werden kann.


    Lies das Tutorial und wenn du weitere Fragen hast, kannst du gerne fragen.

  • Ich verstehe schon was du meinst.


    Nur mMn. bringt die Klasse keinen Unterschied zur mysqli-Klasse.
    "Deine" Klasse connected einfach nur und mysqli connected, query'd, fetched Results.


    Zumal die mysql_... Funktionen irgendwann deprecated sind und nicht mehr in
    neueren PHP-Releases auftauchen.


    Ich mein, Ich will das Tutorial nicht schlecht reden, Ich finds gut. :)
    Nur das ist mir halt aufgefallen

    Benutze hauptsächlich folgende Technologien: Hyper-V, KVM, OpenVZ, Xen, PHP, C++, Exchange 2010, Citrix, KDTOP

  • Zitat
    PHP
    $PlayerInfo = mysql_fetch_object(mysql_query("SELECT * FROM user_tabelle WHERE username = '".$_SESSION['username']."' LIMIT 1");

    Sessions lassen sich leicht manipulieren, und bieten hier ein wunderbares ziel. Ausserdem solltest du in Query's immer backticks nutzen.

    The fact is, I am right. And if you think I'm wrong, you are wrong.

  • Da hast du vollkommen recht, sollte auch schon für Personen sein, die etwas PHP Kentnisse haben.

    $PlayerInfo = mysql_fetch_object(mysql_query("SELECT * FROM user_tabelle WHERE username = '".$_SESSION['username']."' LIMIT 1");






    Sessions lassen sich leicht manipulieren, und bieten hier ein wunderbares ziel. Ausserdem solltest du in Query's immer backticks nutzen.

    PHP
    $PlayerInfo = mysql_fetch_object(mysql_query("SELECT * FROM `user_tabelle` WHERE `username` = '".$_SESSION['username']."' LIMIT 1");
  • Da der User gesperrt ist, muss ich hier unter den Thread schreiben:


    Ist es vorteilhafter mit Klassen zu arbeiten, oder mit einer einfachen PHP-Seite?


    Eine Antwort reicht mir. - Danke.


    Viele Grüße
    Chris