[PHP] Login,Logout,Session,Prüfung

Dieses Thema im Forum "Webentwicklung" wurde erstellt von SoulOfRussia, 9. November 2010 .

Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 9. November 2010
    Login,Logout,Session,Prüfung

    Wie man im Titel schon sehen kann, hab ich ein Problem mit meinem Login Script...

    Hiermal die Dateien+Code:

    anmelden.php(leitet hauptsächlich von index.php auf home.php um...)
    PHP:
    <? 
    #session_start();
    header  ( "Location: home.php" ); 
    ?>
    header.php (soll Prüfen ob man angemeldet ist oder nicht.. wenn ja, dann werden weitere Inhalte freigegeben)
    PHP:
    <?  session_start ();  // Session starten.  ?>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Video Competition</title>
    <link href="style.css" rel="stylesheet" type="text/css" />
    </head>
    <body id="background">
    <div id="header">
    <div id="headerlogin" align="right">
    <?php  

    if (empty( $_SESSION [ "user_id" ]))  
    {  
        echo 
    '<form action="login.php" method="post">' ;
        echo 
    'Name: <input type="text" name="name" size="15"><br>' ;
        echo 
    'Kennwort: <input type="password" name="pwd" size="15"><br>' ;
        echo 
    '<input type="submit" name="log" value="Login">' ;
        echo 
    '</form><br><a href="reg.php">Registrieren</a> | <a href="pwrucksetz.php">Passwort vergessen?</a>' ;
        echo 
    '<form method="post">' ;

    else{
        echo 
    "Du bist momentan angemeldet!" ;
         echo 
    '<br><a href="logout.php">Logout</a>' ;
        }
    ?>

    <br />
    </div></div>
    <div id="content">
    <?php  include ( "werbung.php" );  ?>
        <div id="contentt">
    reg.php (Eintragung in Datenbank. Funktioniert)
    PHP:
    <?  #include("anmelden.php");  ?>
    <? 
    include( "header.php" );  ?>
    <?php
    $host 
    "lokalerhorst" ;
    $user  "irgenteinserver" ;
    $pass  "irgenteinpasswort" ;
    $database  "irgenteinedatenbank" ;
    $dz  mysql_connect ( $host $user $pass );
    mysql_select_db ( $database $dz );
    ?> <html> <head> <title>Untitled Document</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body> 
    <?php
    if(isset( $_POST [ 'submit' ])) {
           if(empty(
    $_POST [ 'name' ])) {
                  
    $fehler  .=  "<li>Der Name fehlt!</li>" ;
           }
        
    #######################################################################
           
    if(empty( $_POST [ 'pwd' ])) {
                  
    $fehler  .=  "<li>Das Passwort fehlt!</li>" ;
           }
           
    #######################################################################
          # if(empty($_POST['code'])) {
           #       $fehler .= "<li>Der Code fehlt!</li>";
          # }
           #######################################################################
          # elseif($_POST['code'] == $_POST['codetrue']) {
                       #Garnichts ist!^^#
          # }
           #######################################################################
          # else {
         #    $fehler .= "<li>Der Code ist Falsch</li>";
          # }
        #######################################################################
        
    $wunschname  $_POST [ 'name' ]; //Wunschname wird aus dem Formular gelesen.
    $x  0 //Beliebige Variabele auf 0 setzen.(Optional)
    $sql  mysql_query ( "SELECT * FROM benutzerdaten" );
    while(
    $data  mysql_fetch_object ( $sql )) {  //Die uebliche Abfrage, alles eimal durch.
    $name  $data -> Nickname //$name bekommt den Wert aus der Tabelle.
    if( $wunschname  ==  $name ) {
          
    $x  1 ;
          
    $fehler  .=  "<li>Der Benutzername ist schon vergeben!</li>" ;
    }
    }
    if(
    $x  !=  1 ) echo  "Der Benutzername ist noch zu haben. " //Hier koennen natuerlcih auch Daten uebergeben werden.
     
     
     
        
    if(empty( $fehler )) {
                
    $query  "INSERT INTO benutzerdaten SET
                   Nickname = '"
    . $_POST [ 'name' ]. "',
                   Passwort = '"
    . $_POST [ 'pwd' ]. "'" ;
                
    $sql  mysql_query ( $query ) or die( mysql_error ());
                echo 
    "Danke für deine registrierung<script type=\"text/javascript\">location.href=\"home.php\";document.write(\"Weiterleitung\")</script>" ;
       
    header  ( "Location: home.php" );
           }
        else echo 
    "<h2>ERROR:<ul>" . $fehler . "</ul></h2>" ;
    }
    elseif(!isset(
    $_POST [ 'submit' ])) { #Garnichts ist#
    }
    ?> <form method="post">
    Name:<br> <input type="text" name="name"><br><br>
    Passwort:<br> <input type="password" name="pwd">
    <br><br> <input type="submit" name="submit" value="Abschicken"> </form> </body> </html> 
     <?  include( "footer.php" );  ?>
    login.php (das Script fürs Einloggen... das ist das was nicht klappt. Ich glaub $_SESSION["user_id"] wird nicht an den header übergeben, damit der weiß ob man eingeloggt ist oder nicht...)
    PHP:
    <? php
    session_start
    ();
    $host  "lokalerhorst" ;
    $user  "irgenteinserver" ;
    $pass  "irgenteinpasswort" ;
    $database  "irgenteinedatenbank" ;
    $dz  mysql_connect ( $host $user $pass );
    mysql_select_db ( $database $dz );
    if(
    $_GET [ 'o' ] ==  1 ) {
         
    $variable  "Sie sind nun nicht mehr eingeloggt!" ;
    }
    if(
    $_GET [ 'l' ] ==  1 ) {
         
    $variable  "Sie müssen sich erst einloggen!" ;
    }
    $passwort  $_POST [ 'pwd' ];
    $name  $_POST [ 'name' ];
    if(isset(
    $_POST [ 'log' ])) {
           if(empty(
    $name ))  $fehler  .=  "<li>Kein Name eingegtragen</li>" ;
           if(empty(
    $_POST [ 'pwd' ]))  $fehler  .=  "<li>Kein Passwort eingetragen</li>" ;
           if(empty(
    $fehler )) {
                
    $verbindung  mysql_fetch_object ( mysql_query ( "SELECT * FROM benutzerdaten WHERE name = ' $name '" ));
                
    $pw  $verbindung -> Passwort ;
                
    $usr  $verbindung -> Nickname ;
                
    $id  $verbindung -> id ;
                if(
    $pw  ==  $passwort ) {
     
                      
    $_SESSION [ "user_id" ] =  $id ;  
                       
    $_SESSION [ "user_nickname" ] =  $usr ;  
                      
    setcookie ( "logged" "1" time ()+ 2592000 );
                      
    $variable  "Login abgeschlossen!<script type=\"text/javascript\">location.href=\"home.php\";document.write(\"Weiterleitung\")</script>" ;
                      
    header  ( "Location: home.php" );
                } else 
    $variable  "Login fehlgeschlagen!
                <script type=\"text/javascript\">location.href=\"home.php\";document.write(\"Weiterleitung\")</script>"
    ;
                      
    header  ( "Location: home.php" );
                } elseif(isset(
    $fehler ))  $variable  "ERROR: <ul>" . $fehler . "</ul>" ;
    }
    ?>
     
  2. 9. November 2010
    AW: Login,Logout,Session,Prüfung

    1. die sache mit dem cookie
    setcookie solltest du nochmal überdenken. sonst kann man sich einloggen ohne benutzername/passwort.

    du musst wissen, dass cookies bei client gespeichert werden und man diese selbst setzen und modifizieren kann. ich könne nun selbst einen cookie erstellen mit namen "logged" und inhalt "1" und wäre eingeloggt (wobei man in deinem script nichts von einem cookie-login lesen kann, aber ich denke sowas hattest du vor).

    2. $name und sql-injections
    alle variablen die vom client kommen müssen gefiltert werden. leitspruch: never trust user-input.
    verwende mysql_real_escape_string() um auf nummer sicher zu gehen, dass in der variable kein schadcode ausgeführt wird.

    3. kein echo/print bei fehlermeldungen?
    irgendwo musst du doch die fehlermeldungen ausgeben?

    4. location-header und ausgabe?
    wenn du einen location-header setzt, ist jede ausgabe im body zwecklos bzw. sollte bei einer weiterleitung nur einen link zur zielseite beinhalten. aber da du alle ausgaben eh in einer variablen speicherst und nie ausgibst (siehe punkt 3) ist das eh egal

    zum location-header sollte noch gesagt werden, dass laut RFC eine vollstänige URI erwartet wird. also mit http:// usw. klar funktioniert das so wie du es machst, aber nur weil die gänigsten browser den rest selbst erledigen.

    5. die sache mit den short-tags <? ?>
    nutze nur <?php, denn short-tags werden in den kommenden versionen nach und nach deaktiviert. d.h. dein code innerhalb von <? ?> wird nicht ausgeführt.

    wenn wir schon dabei sind. sollte deine php-datei mit php-code enden (also mit einem offenen <?php tag), dann kannst du den schliessenden tag (?>) weg lassen.

    also so:
    PHP:
    <? php

    // dein php-code hier

    // kein end-tag benötigt.
    das hat auch einen vorteil: leerzeichen, zeilen und auch tabs am ende der datei werden vom php-interpreter geschluckt und nicht (wie sonst) ausgegeben, was in manchen fällen zu unerwartetem verhalten führen könnte (session und cookies funktionieren nicht mehr oder das html-layout wird verschoben).
     
  3. 9. November 2010
    AW: Login,Logout,Session,Prüfung

    1. die sache mit dem cookie
    ...(wobei man in deinem script nichts von einem cookie-login lesen kann, aber ich denke sowas hattest du vor).

    Nee... denke nicht das ich das vor hatte


    3. kein echo/print bei fehlermeldungen?
    irgendwo musst du doch die fehlermeldungen ausgeben?

    Kommt noch


    5. die sache mit den short-tags <? ?>
    nutze nur ... verchoben).

    Uunnd wieder was gelernt
     
  4. 10. November 2010
    AW: Login,Logout,Session,Prüfung

    Steht dein Passwort als Klartext in der Datenbank? Bau da mal eine Verschlüsselung ein (md5, sha1, ... am besten mit Salt).

    Zu Murdocs erstem Punkt. Schau dir zB die Cookies an, die das vBulletin setzt, da sind userid und ein Hash des Passworts dabei. Da du das aber anscheinend nicht einbauen wolltest, sage ich dazu weiter mal nichts.
     
  5. 10. November 2010
    AW: Login,Logout,Session,Prüfung

    den hash hab ich vorerst rausgenommen da alles noch zu Testzwecken besteht...(Alles Lokal)
     
  6. 10. November 2010
    AW: Login,Logout,Session,Prüfung

    Code:
    $variable = "Login fehlgeschlagen!
     <script type=\"text/javascript\">location.href=\"home.php\";document.write(\"Weiterleitung\")</script>";
     header ("Location: home.php");

    Wirklich Sinn ergibt das aber nicht oder? Du schreibst einen Text der schonmal gar nicht angezeigt wird. Dazu eine header Weiterleitung + Javascript-Weiterleitung macht für mich absolut keinen Sinn.


    Und die Sessions werden nicht an den Header übergeben.
    Die Sessions sind quasi Cookies die nicht auf dem Rechner von dir gespeichert werden sondern auf dem Server. Um auf diese zuzugreifen zu können musst du natürlich die Session starten.
    Wie sieht also deine home.php aus?

    PHP:
    <? php session_start ();

    print_r ( $_SESSION );
    Schreib das mal in deine home.php in die erste Zeile, logg dich über dein Script ein und schau was der Session Array ausgibt. Auch schonmal den MySQL Array geprintet und geschaut ob der mit Inhalt gefüllt ist?
     
  7. 10. November 2010
    AW: Login,Logout,Session,Prüfung

    okay, hab jetzt die header weiterleitung rausgenommen
    der text ist eher für mich

    un in der home.php steht:
    PHP:
    <? include( "header.php" );  ?>    

          <p>Willkommen auf Blablabla<br />
          Hier wird dann der Content stehen... blabalbalbalablb<br /> blabalbalba ;)<br />
     
    <?  include( "footer.php" );  ?>




    also müsste ich

    <?php session_start ();

    print_r ( $_SESSION );

    in die header.php schreiben
    PHP:
    <? php session_start ();

    print_r ( $_SESSION ); ?> 
    <!DOCTYPE html ...
    ...
    <div id="headerlogin" align="right">
    <?php  

    if (empty( $_SESSION [ "user_id" ]))  
    {  
        echo 
    '<form action="login.php" method="post">' ;
        echo 
    'Name: <input type="text" name="name" size="15"><br>' ;
        echo 
    'Kennwort: <input type="password" name="pwd" size="15"><br>' ;
        echo 
    '<input type="submit" name="log" value="Login">' ;
        echo 
    '</form><br><a href="reg.php">Registrieren</a> | <a href="pwrucksetz.php">Passwort vergessen?</a>' ;
        echo 
    '<form method="post">' ;

    else{
        echo 
    "Du bist momentan angemeldet!" ;
         echo 
    '<br><a href="logout.php">Logout</a>' ;
        }


    ?>
    <br />
    </div></div>
    <div id="content">
    <?php  include ( "werbung.php" );  ?>
        <div id="contentt">
    edit:
    AHA
    der gibt mir
    Array ( [user_id] => [user_nickname] => admin [user_nachname] => [user_vorname] => )
    aus... also ist user_id leer, und es wird immer der login angezeigt...

    edit2:
    hab was in der login.php geändert:
    PHP:
                $verbindung  mysql_fetch_object ( mysql_query ( "SELECT * FROM benutzerdaten WHERE name = ' $name '" ));
    PHP:
    $verbindung  mysql_fetch_object ( mysql_query ( "SELECT * FROM benutzerdaten WHERE Nickname = ' $name '" ));
    war wohl ein flüchtigkeitsfehler -.-

    jetzt gibt er
    Array ( [user_id] => 1 [user_nickname] => admin [user_nachname] => [user_vorname] => [user_eingeloggt] => )
    aus... somir ist user_id nicht leer und der gibt als HTML:
    "Du bist momentan angemeldet!
    Logout"
    aus.
    Logout funktioniert auch... der löscht nun das array, und gibt anschließend das login formular aus.

    hier nochmal die logout.php
    PHP:
    <? php 
    // Wird ausgeführt um mit der Ausgabe des Headers zu warten. 
    ob_start  (); 

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

    header  ( "Location: home.php" ); 
    ob_end_flush  (); 
    ?> 
    UND: Danke euch ^^
     
  8. 10. November 2010
    AW: Login,Logout,Session,Prüfung

    was passiert wenn sich ein benutzer mit ' || 1=1 -- einloggt?

    der query würde dann so an die datenbank weitergeleitet werden:
    Code:
    SELECT * FROM benutzerdaten WHERE Nickname = '' || 1=1
    1=1 stimmt immer, also wird min. ein eintrag gefunden. passwort existiert nicht = benutzer wäre eingeloggt.
    mit nem union-select dahinter sogar als admin etc. wie man lustig ist.

    siehe punkt 2 in meinem beitrag oben

    ----

    erledigt -> closed
     
  9. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.