Ankündigung

Einklappen
Keine Ankündigung bisher.

ein login-system, basierend auf MySQL und sessions

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • ein login-system, basierend auf MySQL und sessions

    erfahrungsgemäß wollen PHP-anfänger immer gleich hoch hinaus. dies beginnt z.b. oft mit der typischen, sog. clan-page über eine eigene community hinweg zum größeren vorhaben (was leider oft scheitert, da man nicht immer bereit ist, sich auch mal theorie anzulesen).
    das login-system, das ich vorstelle ist ein einfaches, aber sehr sicheres und effizientes, das durchaus noch weiter ausgebaut werden kann.

    man beginnt mit dem einfachsten, dem formular.
    erstellt ein formular nach euren wünschen oder richtet euch nach dem hier gegebenen:

    login.html
    Code:
    <form action="check_login.php" method="POST">
    username:
    <br>
    <input type="text" name="u_name">
    
    <p>
    
    password:
    <br>
    <input type="password" name="u_pass">
    
    <p>
    
    <input type="submit" value="login">
    </form>
    damit ist das formular schon fertig.

    als nächstes muss eine datenbankstruktur her, die in einer SQL-datei abgelegt auf einem SQL-server ausgeführt und mit benutzerdaten gefüttert wird.
    hier wird auf eine MySQL-datenbank zurückgegriffen:

    structure.sql
    Code:
    CREATE TABLE u_users
       (
       u_id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
       u_name VARCHAR(50) NOT NULL,
       u_pass VARCHAR(33) NOT NULL
       );
    weswegen die spalte u_pass 33 stellen hat, kann weiter unten gelesen werden.

    es wird noch eine konfigurationsdatei benötigt, in der die zugriffsdaten für den server gespeichert sind.

    config.inc.php
    PHP-Code:
    <?php
    //eine variable als array deklarieren, um mehrere werte in einem zusammenzufassen
    $_access = array();

    $_access['host'] = 'localhost'//kann abweichen, ist aber meistens "localhost"
    $_access['user'] = ''//der benutzername
    $_access['pass'] = ''//das passwort
    $_access['name'] = ''//der name der datenbank
    ?>
    nun muss noch eine verbindung mit der datenbank aufgebaut werden, die geschieht der besseren übersicht wegen durch eine weitere datei.

    connect.inc.php
    PHP-Code:
    <?php
    if(!$conn mysql_connect($_access['host'], $_access['user'], $_access['pass']))
        {
        echo 
    'verbindung zu '.$_access['host'].' fehlgeschlagen';
        exit();
        }

    if(!
    $db_select mysql_select_db($_access['name']))
        {
        echo 
    'die erforderliche datenbank antwortet nicht';
        exit();
        }
    ?>
    es wird also jedes mal geprüft, ob etwas NICHT ausgeführt wurde. sobald eine der beiden funktion FALSE ausgibt, wird der vorgang abgebrochen.

    jetzt die eigentliche login-funktion, die eher eine überprüfung darstellt und dementsprechend reagiert.

    check_login.php
    PHP-Code:
    <?php
    session_start
    ();

    //konfiguration und verbindungsdaten holen
    include_once('config.inc.php');
    include_once(
    'connect.inc.php');

    //prüfen, ob die eingabefelder ausgefüllt wurden
    if(empty($_POST['u_name']) || empty($_POST['u_pass']))
        {
        
    //wenn sie nicht ausgefüllt wurden
        
    echo 'es wurden nicht alle relevanten felder ausgefüllt';
        exit();
        }
            
    //wenn sie ausgefüllt wurden
            
    else
                {
                
    //eine SQL-abfrage vorbereiten und sie abschicken
                
    $sql "SELECT     u_id,
                                u_name,
                                u_pass
                        FROM     u_users
                        WHERE     u_name = '"
    .mysql_real_escape_string($_POST['u_name'])."'
                        AND     u_pass = '"
    .md5($_POST['u_pass'])."'
                        "
    ;
                
                
    $result mysql_query($sql) or die(mysql_error());
                
                
    //prüfung, ob genau eine der spalten mit der eingabe überein stimmt
                
    if(mysql_num_rows($result) != 1)
                    {
                    
    //wenn nicht übereinstimmt
                    
    echo 'sie konnten nicht als benutzer identifiziert werden';
                    exit();
                    }
                        
    //wenn übereinstimmt
                        
    else
                            {
                            
    //eine session "logged" auf TRUE setzen
                            //eine session mit dem usernamen erstellen
                            
    $_SESSION['logged'] = TRUE;
                            
    $_SESSION['u_name'] = $_POST['u_name'];
                            
                            
    //auf die geschützte datei weiterleiten
                            
    header('location: intern.php');
                            exit();
                            }
                }
    ?>
    die datei intern.php ist ganz einfach zu erstellen.

    intern.php
    PHP-Code:
    <?php
    session_start
    ();
    include_once(
    'val_login.php');

    echo 
    'hallo' .$_SESSION['u_name'].', willkommen im internen bereich';
    ?>
    das wars auch, aber moment! in der intern.php taucht eine datei auf, die noch nicht besprochen wurde, die val_logn.php.

    val_login.php
    PHP-Code:
    <?php
    //prüfen, ob die session "logged" FALSE ist
    if($_SESSION['logged'] == FALSE)
        {
        
    //wenn FALSE, dann zum login-formular weiterleiten
        
    header('location: login.html');
        exit();
        }
    ?>
    zuguterletzt müsst ihr euch auch noch ausloggen können.

    logout.php
    PHP-Code:
    <?php
    session_start
    ();

    //die sessions auf FALSE setzen
    $_SESSION['logged'] = FALSE;
    $_SESSION['u_name'] = FALSE;

    //zum login-formular weiterleiten
    header('location: login.html');
    ?>
    ach ja, es fehlt noch die begründung der 33 stellen im passwort-feld.
    aus sicherheitsgründen wird das passwort eines benutzers in der datenbank verschlüsselt, hierzu wird die funktion md5() genutzt. sie verschlüsselt auf 32 bit, belegt als genau 32 stellen.
    wenn man etwas md5-verschlüsselt ausgeben will, nutzt man einfach folgenden code-schnippsel:

    PHP-Code:
    <?php
    echo md5('mich muss man verschlüsseln');
    ?>
    so, ich hoffe, ich habe euch den das login-system etwas näher gebracht. dieses system ist sofort einsatzbereit und auf fehler geprüft.
    sollte irgendetwas unklar sein, berichtet es mir und ich werde es editieren.

    Nils aka XraYSoLo


  • #2
    Hast aber einen Fehler drinne...

    Bei: val_login.php

    da steht:

    PHP-Code:
    header('login.html'); 
    gehören tut es aber:

    PHP-Code:
    header('location: login.html'); 
    Und bei: logout.php

    würde ich aus:

    PHP-Code:
    <?php
    session_start
    ();

    //die sessions auf FALSE setzen
    $_SESSION['logged'] = FALSE;
    $_SESSION['u_name'] = FALSE
    das hier machen, sprich die sessions löschen:

    PHP-Code:
    <?php
    session_start
    ();

    session_destroy();
    Ich gebe gerne ICQ-Support gegen ein kleines Endgelt.

    Kommentar


    • #3
      done ^^.

      Nils aka XraYSoLo

      Kommentar


      • #4
        mmh ich wurde vorallem mysql_escape_string mit reinsetzten bei den $_POST ansonsten ist das login nicht so sicher desweiteren würd ich die session in der sql tabelle speichern sonst sind mehrfach logins möglich

        greetz Illus23

        Kommentar


        • #5
          aber mehrfach logins sind doch nichts schlechtes... wenn ich seh, wie wir in der firma hier am testen sind, wenn wir ein neues projekt starten. dann brauchen wir auf jeden fall mehrfachlogins.

          Kommentar


          • #6
            oke gebe *Schande auf mein Haupt* kommt natürlich immer drauf an wo man es verwendet gerade in unserer Firma sind Mehrfachlogins aus Sicherheitsgründen verboten und ich dachte noch an Browsergames wo Mehrfachlogins auch nicht ganz Sinnvoll wären

            Kommentar


            • #7
              PHP-Code:
              mysql_escape_string(); 
              was sollen daran besser sein als an:

              PHP-Code:
              mysql_real_escape_string(); 
              @fragnicht?

              Ich persönlich, würde noch die $_POST felder addslashen...


              Ambience
              Ich gebe gerne ICQ-Support gegen ein kleines Endgelt.

              Kommentar


              • #8
                oh sry habe mysql_real_escape_string nicht gesehn

                Kommentar


                • #9
                  Beim File check_login.php --> if(mysql_num_rows($reuslt) != 1)
                  Ich vermute mal stark, du wolltest da eigentlich $result nehmen.

                  Ausserdem ist der Gebrauch des Message-Digest Algorithmus' keine Verschlüsselungsmethoden. Zeichenketten die mit md5() bearbeitet wurden sind NICHT verschlüsselt. Es wurde lediglich gemäss einem Pattern ein Hash erstellt der übrigends NICHT 32 sondern 128 Bit lang ist. Dieser 128 Bit lange String wird lediglich durch einen 32 ZEICHEN langen String ausgedrückt (Nachzulesen auch auf Message-Digest Algorithm 5 - Wikipedia).

                  Ansonsten finde ich es ein gelungenes Tutorial. Weiter so.
                  Das Recht auf Dummheit gehört zur Garantie der freien Entfaltung der Persönlichkeit.
                  Mark Twain

                  Kommentar


                  • #10
                    Wenn man die Felder anständig validiert, kann man auf addslashes und co verzichten. Reguläre Ausdrücke sind ein mächtige Werkzeug
                    Nicht jeder Fehler ist ein Bug.

                    Kommentar


                    • #11
                      Wegen Spam gelöscht

                      Kommentar


                      • #12
                        gott, fängt diese spammerei jetzt hier auch an...chefs, löscht das bitte mal (ich kenn' das von html.de, da gabs auch mal 'ne welle von diesem dreck).

                        Nils aka XraYSoLo

                        Kommentar


                        • #13
                          Es wäre gut, wenn das Formular valides HTML 4 wäre, noch besser xhtml konform
                          Code:
                          <form action="check_login.php" method="post">
                            <p>
                              username:
                              <br />
                              <input type="text" name="u_name" />
                            </p>
                            <p>
                              password:
                              <br />
                              <input type="password" name="u_pass" />
                            </p>
                            <p>
                              <input type="submit" value="login" />
                            </p>
                          </form>
                          Zitat von XraYSoLo Beitrag anzeigen
                          if(!$db_select($_access['name']))
                          Entweder ein Schreibfehler oder es fehlt irgendwo noch $db_select='mysql_select_db'. Letzteres macht aber kaum Sinn.

                          Kommentar


                          • #14
                            Hey, der Script hört sich ganz nett an. Werde es heute Abend mal ausprobieren.

                            @all: Hat jemand dieses Tutorial schon ausprobiert ? Funktioniert das?

                            ich kenn' das von html.de, da gabs auch mal 'ne welle von diesem dreck
                            xray, erinner mich nich an dieses Kiddi-Forum Möchte mein Feierabend nachher genießen können *greez*

                            Kommentar


                            • #15
                              1. solange ich noch da meinen posten hab', werd' ich das eindämmen, wies mir möglich ist ^^
                              2. ich selber verwende diesen login-mechanismus selber schon sehr erfolgreich
                              3. das db_select kommt davon, dass ich normalerweise mehrere DBs verwende
                              4. das formular soll ja nur zu tutorial-zwecken dienen
                              5. ich arbeite immernoch mit 4.01 trans ^^ (und das ist doch valide da oben, bis auf das fehlende grundgerüst)
                              6. JETZT sollte aber alles klar sein, oder?

                              Nils aka XraYSoLo

                              Kommentar

                              Lädt...
                              X