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

  • XraYSoLo
    hat ein Thema erstellt ein login-system, basierend auf MySQL und sessions.

    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

  • Papst
    antwortet
    Debugging sollte helfen:

    PHP-Code:
    <?php
    $result 
    mysql_query($sql) or die(mysql_error());
    ?>

    Einen Kommentar schreiben:


  • gene
    antwortet
    Liegt es an dem?
    "SELECT ".
    "Id, Nickname".
    "FROM ".
    "user".
    "WHERE ".
    Ausgeschrieben steht da doch .. "SELECT ID, NicknameFROM userWHERE ..." Also ich meine dass keine Leerzeichen dazwischen sind.

    Mal mit error_reporting(E_ALL); versucht?

    Einen Kommentar schreiben:


  • maroinho
    antwortet
    Kann das Problem von der config.inc.php stammen?

    Einen Kommentar schreiben:


  • maroinho
    antwortet
    no

    Ne, tut sich leider nichts,
    wieder die selbe Meldung.

    Einen Kommentar schreiben:


  • cycap
    antwortet
    wenn du den code den ich dir geschrieben hab in die DB schreibst anstelle des passworts gehts nicht?

    Einen Kommentar schreiben:


  • maroinho
    antwortet
    Habs in der Datenbank selber versucht, richtig?
    Nimmt der wieder nicht an.
    Hab md5 dann weggenommen, mit admin, admin versucht,
    nimmt der auch nicht.

    Was ist denn los?

    Einen Kommentar schreiben:


  • cycap
    antwortet
    Das Passwort in der Datenbank muss md5 verschlüsselt sein, für test wäre das 098f6bcd4621d373cade4e832627b4f6

    Einen Kommentar schreiben:


  • maroinho
    antwortet
    Verzweiflung!!!

    Hallo Leute!

    Habe versucht einen geschützten Bereich mit Hilfe von Sessions und MySQL zu programmieren, aber leider funktionert es nicht.

    Finde den Fehler einfach nicht.

    Kann mir vielleicht jemand helfen?

    Hier der code:

    db:

    CREATE TABLE user (
    Id Int(11) NOT NULL auto_increment,
    Nickname VarChar(50) NOT NULL default '',
    Kennwort VarChar(50) NOT NULL default '', PRIMARY KEY (Id)
    )
    ------------------------------
    1 User: Nickname : test, Kennwort: test


    login.php
    PHP-Code:
    <?php  
    // Session starten 
    session_start (); 

    // DBverbindung aufbauen  
    $connectionid mysql_connect ("lokalhost""db-user""dbpw");  
    if (!
    mysql_select_db ("db"$connectionid))  
    {  
      die (
    "Keine Verbindung zur Datenbank");  
    }  

    $sql "SELECT ".  
        
    "Id, Nickname".  
      
    "FROM ".  
        
    "user".  
      
    "WHERE ".  
        
    "(Nickname like '".$_REQUEST["name"]."') AND ".  
        
    "(Kennwort = '".md5 ($_REQUEST["pwd"])."')";  
    $result mysql_query ($sql);  

    if (
    mysql_num_rows ($result) > 0)  
    {  
      
    // Benutzerdaten in ein Array auslesen.  
      
    $data mysql_fetch_array ($result);  

      
    // Sessionvariablen erstellen und registrieren  
      
    $_SESSION["user_id"] = $data["Id"];  
      
    $_SESSION["user_nickname"] = $data["Nickname"];  
      

      
    header ("Location: intern.php");  
    }  
    else  
    {  
      
    header ("Location: formular.php?fehler=1");  
    }  
    ?>
    formular.php
    PHP-Code:
    <?php session_start (); ?> 
    <html>  
    <head>  
      <title>Login</title>  
    </head>  

    <body>  
    <?php  
    if (isset ($_REQUEST["fehler"]))  
    {  
      echo 
    "Die Zugangsdaten sind ungültig.";  
    }  
    ?>  
    <form action="login.php" method="post">  
      Name: <input type="text" name="name" size="20"><br>  
      Kennwort: <input type="password" name="pwd" size="20"><br>  
      <input type="submit" value="Login">  
    </form>  
    </body>  
    </html>
    checkuser.php
    PHP-Code:
    <?php  
    session_start 
    ();  
    if (!isset (
    $_SESSION["user_id"]))  
    {  
      
    header ("Location: medien.php");  
    }  
    // Datei wird nicht direkt aufgerufen, sondern per include() am Anfang jeder internen Seite eingefügt.
    ?>
    intern.php
    PHP-Code:

    <?php  
    include ("checkuser.php");  
    ?>  
    <html>  
    <head>  
      <title>Interne Seite</title>  
    </head>  
    <body>  
      BenutzerId: <?php echo $_SESSION["user_id"]; ?><br>  
      Nickname: <?php echo $_SESSION["user_nickname"]; ?>
      <hr>  
      <a href="logout.php">Ausloggen</a>  
    </body>  
    </html>
    logout.php
    PHP-Code:
    <?php  
    // Wird ausgeführt um mit der Ausgabe des Headers zu warten.  
    ob_start ();  

    session_start ();  
    session_unset ();  
    session_destroy ();  

    header ("Location: formular.php");  
    ob_end_flush ();  
    ?>
    Also ich gebe, Nickname und Kennwort test ein, aber...

    es kommt immer
    Die Zugangsdaten sind ungültig.

    Warum?

    HILFE!!!!

    Einen Kommentar schreiben:


  • Maribel
    antwortet
    Ahhhh, ein Leerzeichen nach dem ?> in der connect.inc.php bringt mich 4 Stunden lang zum verzweifeln.

    Danke Dir, nun kann ich wenigstens ruhig schlafen

    Gruß Maribel

    Einen Kommentar schreiben:


  • David
    antwortet
    output started at C:\xampp\htdocs\intra\config.inc.php:10
    In Zeile von config.inc.php findet eine Ausgabe statt. Vermutlich hast Du da eine Leerzeile am Ende der Datei.

    Tipp: Wenn nach dem PHP Code in einer Datei nichts mehr folgt, lass das ?> am Ende weg. Dann treten solche Fehler nicht auf.

    Einen Kommentar schreiben:


  • Maribel
    antwortet
    Danke erstmal für Deine schnelle Antwort David.

    Nur wo?
    Wenn ich das Script richtig verstehe, sollte bei richtigem Namen und Passwort kein Output erfolgen.

    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();
                            }
                }
    ?>
    Ich bin am verzweifeln

    Gruß Maribel

    Einen Kommentar schreiben:


  • David
    antwortet
    Selbes Problem. Auch vor header() dürfen keine Daten an den Client gesendet werden.

    Einen Kommentar schreiben:


  • Maribel
    antwortet
    Ganz neu und gleich ein riesiges Problem:

    Habe das Tut ausprobiert und bekomme folgende Fehlermeldungen:

    logincheckWarning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\xampp\htdocs\intra\check_login.php:10) in C:\xampp\htdocs\intra\check_login.php on line 11

    Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at C:\xampp\htdocs\intra\check_login.php:10) in C:\xampp\htdocs\intra\check_login.php on line 11

    Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\intra\check_login.php:10) in C:\xampp\htdocs\intra\check_login.php on line 54
    Habe den Code kopiert und die Tabelle angelegt in meiner Datenbank.

    Gebe ich keine Daten ein, kommt nach den ersten beiden Fehlermeldungen wenigstens noch die Ausgabe:

    es wurden nicht alle relevanten felder ausgefüllt
    Bitte um Hilfe

    Grüße aus Paraguay
    Maribel

    Edit:

    also die beiden session_start Fehlermeldungen habe ich eliminiert, lag daran, das es nicht als erstes in der Datei stand.

    Nun kommt aber bei richtigem Namen und Passwort:

    Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\intra\config.inc.php:10) in C:\xampp\htdocs\intra\check_login.php on line 45

    Einen Kommentar schreiben:


  • Jerold
    antwortet
    <Erledigt>

    Einen Kommentar schreiben:

Lädt...
X