[PHP] Loginscript => Denkfehler?

Dieses Thema im Forum "Webentwicklung" wurde erstellt von DOWNandOUT, 17. November 2007 .

  1. 17. November 2007
    Loginscript => Denkfehler?

    Hi, ich habe ein Loginscript geschrieben, aber das funktioniert noch nicht richtig, es hapert an einer IF abfrage wo anscheinend false zurückgegeben wird.

    Code:
    PHP:
    <? php
    session_start
    ();

    require 
    './global.php' //Das Framework includieren

    $location  = array(
            
    'href'  =>  'login.php' ,
            
    'title'  =>  'Login'
    );

    $S_username  $_POST [ 'username' ];
    $S_passwort  $_POST [ 'passwort' ];

    $query  $db -> query ( "SELECT * FROM `cc_user` WHERE
              `username` LIKE '"
    . $S_username . "' AND
              `passwort` = '"
    . md5 ( $S_passwort ). "'" );
    $row1  $db -> fetch_assoc ( $query );

    if (isset(
    $S_username $S_passwort ))
        {
        if (
    $S_username  ==  ""  OR  $S_passwort  ==  "" )
            {
            echo 
    "<b>Beide Felder müssen ausgefüllt sein!</b>" ;
            }
    elseif (
    $S_username  ==  $row1 . username  AND  md5 ( $S_passwort ) ==  $row1 . passwort )
                {
    //if $db->num_rows($query) > 0) {
        
    $S_userpass  $db -> fetch_array ( $query );
        
    // Sessions
        
    $_SESSION [ 'cc_userid' ] =  $S_userpass [ 'id' ];
        
    $_SESSION [ 'cc_username' ] =  $S_userpass [ 'username' ];
        
    $_SESSION [ 'cc_password' ] =  md5 ( $S_userpass [ 'passwort' ]);
        echo 
    'LOL' ;  
    }
    }
    ?>
    ($S_username == $row1.username AND md5($S_passwort) == $row1.passwort)
    => Hier scheint es ein Problem zugeben, da er unten auch kein echo 'LOL' ausgibt.
    Habe ich vielleicht nur einen Denkfehler drin? Bitte um hilfe.
     
  2. 17. November 2007
    AW: Loginscript => Denkfehler?

    Nein, habe mich gerade beim Copy&Paste hier verippt an einer Stelle xD
     
  3. 17. November 2007
    AW: Loginscript => Denkfehler?

    Wird das Passwort ebenfalls als md5-Hash abgespeichert (in der Datenbank)?
    Wenn nein, wird das der Fehler sein.

    PS. Variablen bitte so schreiben:
    $row1['username'] und nicht $row1.username
     
  4. 17. November 2007
    AW: Loginscript => Denkfehler?

    Sehe zwar auf die schnelle keinen Fehler, aber will trotzdem darauf hinweisen das du deine Querys absichern solltest, momentan ist das bisschen unsicher .

    mysql_real_escape_string , nur als kleiner Hinweis
     
  5. 17. November 2007
    AW: Loginscript => Denkfehler?

    1. Ja wird als MD5 abgespeichert.
    2. Das nennt man auch OOP ^^ ich benutze eine MySQL Klasse
     
  6. 17. November 2007
    AW: Loginscript => Denkfehler?

    Naja, wenn du meinst. Bin ja noch PHP-Anfänger.
    Aber an deiner Stelle würd ich mal einige Seminare zum Thema Fehlersuche besuchen - da lernt man wirklich eine strukturierte Fehlersuche in seinen Scripts.

    Und schonmal das Ergebnis des Querys selber überprüft (mittels print $query ausgeben -> String kopieren und in PHPmyAdmin einfügen).
    Vielleicht liegt es ja auch an der Abfrage (warum einmal LIKE und einmal =? -> bin SQL-Noob, sorry).
     
  7. 17. November 2007
    AW: Loginscript => Denkfehler?

    Wenn der Username z.B. Test ist und der user aber klein test eingibt kann das vll nen Fehler hervorrufen deshalb LIKE. Und das pw muss aber genau das gleiche sein.
     
  8. 17. November 2007
    AW: Loginscript => Denkfehler?

    echo $query;
    = Resource id #14

    echo $row1;
    = Nix
     
  9. 17. November 2007
    AW: Loginscript => Denkfehler?

    Ich sehe hier viele viele Fehler.
    1. Unkontrollierte Usereingaben.
    2. SELECT * sollte immer vermieden werden.
    3. LIKE Abfrage ist im Query nicht nötig, hier sollte ein "=" - Vergleich herangezogen werden, vielleicht auch in Komination mit einer md5 - Funktion.
    4. Passwort nie mit in den Query schreiben, sondern den Vergleich in PHP ziehen.
    5.
    Code:
    if (isset($S_username, $S_passwort))
     {
     if ($S_username == "" OR $S_passwort == "")
    
    Die erste Zeile mit isset ist unnütz, da du die Variablen ja selbst definierst und die =="" Kontrolle ist auch unausreichend, weil somit ein Leerzeichen bereits deine Kontrolle bricht. Hier wären Methode wie trim, empty o.Ä. in Kombination deutlich sinnvoller.
    6. Groß- und Kleinschreibung deswegen LIKE? Nönö, MySQL :: MySQL 5.1 Referenzhandbuch :: A.5.1 Groß-/Kleinschreibung beim Suchen ...

    Nein das nennt man vielleicht Halbwissen, aber nicht "OOP ^^", denn der Punktoperator existiert bzgl. dessen nicht in PHP. Hier wird der "->"-Operator genutzt, um auf Eigenschaften eines Objektes zuzugreifen.

    Allgemein n Thread mit Metafragen ....
    Neue Vorgehensweise um den Fehler zu finden sollte jetzt folgendes sein.
    1. Nochmal PHP verinnerlichen.
    2. Post - Array kontrollieren
    3. Query kontrollieren
    4. PHP - Code ausbessern!
     
  10. 17. November 2007
    AW: Loginscript => Denkfehler?

    Nochmal zur Information:

    PHP:
    <? php
    $var1 
    'Te' ;
    $var2  'st' ;

    echo 
    $var1 . $var2 ;
    ?>
    Hat nichts mit OOP am Hut, da der . meines Wissens nach lediglich ein Verkettungsoperator ist, die Ausgabe würde "Test" lauten.

    In deinem Falle wäre es mehr..
    PHP:
    <? php
    $row1 
    mysql_fetch_assoc ( $res );  // liefert Array
    define ( "username" , "blubblub" );

    echo 
    $row1 . username ;
    ?>
    wäre die Ausgabe Arrayblubblub, oder hab ich da grad n Denkfehler drin?

    Greetings.
     
  11. 17. November 2007
    AW: Loginscript => Denkfehler?

    Wie meinst du das?

    btw. habe das Script mal abgeändert.
    PHP:
    <? php
    session_start
    ();

    require 
    './global.php' //Das Framework includieren

    $location  = array(
            
    'href'  =>  'login.php' ,
            
    'title'  =>  'Login'
    );

    $S_username  $_POST [ 'username' ];
    $S_passwort  $_POST [ 'passwort' ];

    $query  $db -> query ( "SELECT * FROM `cc_user` WHERE
              `username` = '"
    . $S_username . "'" );
    $row1  $db -> fetch_assoc ( $query );

        if (
    $S_username  ==  ""  OR  $S_passwort  ==  "" )
            {
            echo 
    "<b>Beide Felder müssen ausgefüllt sein!</b>" ;
            }
    elseif (
    $S_username  ==  $row1 . username  AND  md5 ( $S_passwort ) ==  $row1 . passwort )
                {
    //if $db->num_rows($query) > 0) {
        
    $S_userpass  $db -> fetch_array ( $query );
        
    // Sessions
        
    $_SESSION [ 'cc_userid' ] =  $S_userpass [ 'id' ];
        
    $_SESSION [ 'cc_username' ] =  $S_userpass [ 'username' ];
        
    $_SESSION [ 'cc_password' ] =  md5 ( $S_userpass [ 'passwort' ]);
        echo 
    'LOL' ;
    }
    ?>
     
  12. 18. November 2007
    AW: Loginscript => Denkfehler?

    hast du den post von telefonzelle gelesen?
    der punkt ist in php ein zeichen um 2 strings zu verbinden
    der wird nur in template engines verwendet um auf arrays zuzugreifen
    deshalb:
    PHP:
    <? php
    session_start
    ();

    require 
    './global.php' //Das Framework includieren

    $location  = array(
            
    'href'  =>  'login.php' ,
            
    'title'  =>  'Login'
    );

    $S_username  $_POST [ 'username' ];
    $S_passwort  $_POST [ 'passwort' ];

    $query  $db -> query ( "SELECT * FROM `cc_user` WHERE
              `username` = '"
    . $S_username . "'" );
    $row1  $db -> fetch_assoc ( $query );

    if (
    $S_username  ==  ""  OR  $S_passwort  ==  "" ) {
      echo 
    "<b>Beide Felder müssen ausgefüllt sein!</b>" ;
    }
    elseif (
    $row1  &&  $S_username  ==  $row1 [ 'username' ] &&  md5 ( $S_passwort ) ==  $row1 [ 'passwort' ]) {
      
    // Sessions
      
    $_SESSION [ 'cc_userid' ] =  $row1 [ 'id' ];
      
    $_SESSION [ 'cc_username' ] =  $row1 [ 'username' ];
      
    $_SESSION [ 'cc_password' ] =  md5 ( $row1 [ 'passwort' ]);
      echo 
    'LOL' ;
    }
    ?>
    des weiteren solltest du dir über deine programmierlogik mehr gedanken machen
    du führst erst ein query aus und überprüfst DANN ob überhaupt was eingegeben wurde?
    Maken meint übrigens du solltest die funktion mysql_real_escape_string() verwenden
     
  13. 18. November 2007
    AW: Loginscript => Denkfehler?

    Ums genau zu nehmen, kannst du die Abfrage auf überinstimmende Nutzerdaten bereits im Query machen, indem du COUNT() verwendet.
    Bei 1 sind die Daten übereinstimmend, bei 0 nicht.

    Zudem eben die Querys absichern und ganz wichtig, wie Schmitz bereits sagte (falls er das ausdrücken wollte): Operationen erst dann ausführen, wenn diese unbedingt ausgeführt werden müssen und das schließt Abfragen, die vor den eigentlichen Gebrauch ausgeführt werden, mit ein, da diese nur wertvolle Ressourcen (jaja, die gute alte Assembler-Zeit färbt ab =D) kosten.

    Und OOP ist da ja fast garnix, bis auf die Query-Abfrage. Und du selectiert ja immernoch die komplette Tabelle mittels *. In deinem Fall brauchst du nur die ID und das Ergebnis (1 oder 0 => in meinem Fall).
    Zum Thema mit den Arrays sag ich nichts. Haben wir dir öfter gesagt und wenn du so Ignorant (sorry, aber das ist mein Eindruck) bist, biste selber schuld

    PS. Ich seh grad: Was hat die UserID, der Username und das Passwort in einer Session verloren?
    Errechne lieber einen Hash-Wert, über den alles zugewiesen werden kann.
    Auch wenns dann ne Abfrage mehr ist, Sicherheit geht vor
     
  14. 18. November 2007
    AW: Loginscript => Denkfehler?

    du benutzt doch das framework von mir, aber schreibst deine scripte drum rum...

    1. ich hab n update der session-klasse für dich
    2. passwörter werden mit sha1() verschlüsselt
    3. frag beim einloggen zuvor ab ob der user schon eingeloggt is ($session->isGuest())

    ps: mysql_real_escape_string() => $db->escape()
    pps: bei mitgliedern steht ein objekt zur verfügung! $userdata->username und $userdata->userid. einfach $session->fetchUser() aufrufen

    PHP:
    <? php
        
    require  './global.php' //Das Framework includieren
        
        
    if( $session -> isGuest () !==  true ) {
            
    header ( 'location: zur hauptseite oder zum logout ... lass dir was einfallen' );
            exit;
        }
        
        
    $location  = array(
                
    'href'  =>  'login.php' ,
                
    'title'  =>  'Login'
        
    );
        
        

        
    if(isset( $_POST [ 'username' ],  $_POST [ 'passwort' ])) {
            
    $S_username  $db -> escape ( $_POST [ 'username' ]);
            
    $S_passwort  sha1 ( $_POST [ 'passwort' ]);
            
            

            
    if(!empty( $S_username ) && !empty( $S_passwort )) {
                
    $query  $db -> query ( "
                    SELECT 
                        userid,
                        username,
                        passwort,
                        keep_login
                    FROM `cc_user` 
                    WHERE 
                        username = '
    { $S_username } '
                        && password = '
    { $S_passwort } '
                "
    );
                
                

                
    if( $db -> num_rows ( $query ) >  0 ) {
                    
    $row1  $db -> fetch_assoc ( $query );
                    
    //$_SESSION['cc_userid'] = $row1['userid'];
                    //$_SESSION['cc_username'] = $row1['username'];
                    //$_SESSION['cc_password'] = md5($row1['passwort']);
                    //echo 'LOL';
                    
                    /********************************
                    * so änsderst du die session...
                    * passwort wird für den cookie gebraucht, wenn keep_login 1 ist
                    */
                    
    $session -> restartSession ( $row1 );
                } else {
                    
    //zugangsdaten falsch
                
    }
            } else {
                
    //leeres formular
            
    }
        } else {
            
    //formular anzeigen
        
    }
    ?>
     
  15. 18. November 2007
    AW: Loginscript => Denkfehler?

    Und immer noch ein Passwort im Query und zusätzlich mehrere Funktionsaufrufe, die hier noch nicht nötig sind.

    Wie ich bereits sagte, nur die relevanten Daten dem Usernamen entsprechends abfragen und dann ALLES im PHP - Code vergleichen, damit z.B. ein Passwort so sparsam wie möglich genutzt wird.


    Und inwiefern steigert dein Vorgehen die Sicherheit? (Abgesehen davon natürlich, dass das Passwort wirklich nicht nötig ist)

    Die Session kann immernoch als vertrauenswürdige Quelle angesehen werden, da sie als Daten auf dem Server selbst vorliegen. Was drin steht ist somit eigentlich egal, die Verantwortung des Programmierers ist hier, den Session-Ordner und die Einmaligkeit der Session zu schützen.
    Ich denke es ist ein großer Trugschluss solch eine Aussage wie oben als richtig anzusehen, gut bei "OpenSource" - Boards ist es natürlich gesünder gegen Exploiting und RE vorzugehen und so die Session zu maskieren, aber ansonsten sowas von Pupi.
     
  16. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.