#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: <? phpsession_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. + Multi-Zitat Zitieren
#2 17. November 2007 AW: Loginscript => Denkfehler? Vielleicht an dem * hinter dem echo? + Multi-Zitat Zitieren
#3 17. November 2007 AW: Loginscript => Denkfehler? Nein, habe mich gerade beim Copy&Paste hier verippt an einer Stelle xD + Multi-Zitat Zitieren
#4 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 + Multi-Zitat Zitieren
#5 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 + Multi-Zitat Zitieren
#6 17. November 2007 AW: Loginscript => Denkfehler? 1. Ja wird als MD5 abgespeichert. 2. Das nennt man auch OOP ^^ ich benutze eine MySQL Klasse + Multi-Zitat Zitieren
#7 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). + Multi-Zitat Zitieren
#8 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. + Multi-Zitat Zitieren
#9 17. November 2007 AW: Loginscript => Denkfehler? Die Abfrage jetzt mal überprüft? + Multi-Zitat Zitieren
#10 17. November 2007 AW: Loginscript => Denkfehler? echo $query; = Resource id #14 echo $row1; = Nix + Multi-Zitat Zitieren
#11 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! + Multi-Zitat Zitieren
#12 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. + Multi-Zitat Zitieren
#13 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' ; } ?> + Multi-Zitat Zitieren
#14 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 + Multi-Zitat Zitieren
#15 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 + Multi-Zitat Zitieren
#16 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 } ?> + Multi-Zitat Zitieren
#17 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. + Multi-Zitat Zitieren