Ankündigung

Einklappen
Keine Ankündigung bisher.

Wo ist der Fehler bei meinen verschachtelten If ?

Einklappen

Neue Werbung 2019

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

  • Wo ist der Fehler bei meinen verschachtelten If ?

    Hallo,

    ich werde wahnsinnig. Ich habe eine verschachtelte if-Abfrage die verschiedene Dinge prüft. Es geht um den Login. Es wird geprüft:

    1. Existiert ein Account mit den Angaben des Login-Formulars?
    2. Wenn ja, ist der Account freigeschaltet?
    3. Wenn ja, login.

    Es funktioniert soweit auch alles. Ist der account inaktiv, kommt dafür der entspr. Error. Genauso beim User der nicht exisitert. ABER:

    Sind die login-daten korrekt und der account ist freigeschaltet, loggt er auch ein, allerdings wird kurz vorm einloggen, die fehlermeldung "account nicht freigeschaltet" angezeigt!!??

    irgendwo hab ich die If's nicht ganz richtig geschachtelt:

    php-skript, dass validierung prüft
    PHP-Code:
    session_start();

    include 
    'dbc.php';


    //get the posted values
    $user_name=htmlspecialchars($_POST['user_name'],ENT_QUOTES);
    $pass=md5($_POST['password']);

    //validating active status
    $sql2="SELECT id FROM users WHERE email='".$user_name."' and active='1'";
    $result2=mysql_query($sql2);
    $row2=mysql_fetch_array($result2);


    //now validating the username and password
    $sql="SELECT email, password FROM users WHERE email='".$user_name."'";
    $result=mysql_query($sql);
    $row=mysql_fetch_array($result);






        
    //if username exists
        
    if((mysql_num_rows($result)>0) && (strcmp($row['password'],$pass)==0)){
        
            if(
    mysql_num_rows($result2)>0){
                echo 
    "yes";
                
    $_SESSION['user_id']=$user_name;
            }
            else
                echo 
    "inactive";
        }
        else
            echo 
    "no"
    jenachdem was "echo" übergibt, wird etwas getan: (mit JQUERY)
    Code:
    $(document).ready(function()
    {
    	$("#login_form").submit(function()
    	{
    		//remove all the class add the messagebox classes and start fading
    		$("#msgbox").removeClass().addClass('').text('').fadeIn(1000);
    
    		//check the username exists or not from ajax
    		$.post("ajax_login.php",{ user_name:$('#email').val(),password:$('#password').val(),rand:Math.random() } ,function(data)
            {
    		  if(data=='yes') //if correct login detail
    		  {
    		  	$("#msgbox").fadeTo(200,0.1,function()  //start fading the messagebox
    			{ 
    			  //add message and change the class of the box and start fading
    			  $(this).html('Einloggen.....').addClass('messageboxok').fadeTo(900,1,
                  function()
    			  { 
    				  
    			  	 //redirect to secure page
    				 document.location='index.php?site=home';
    					 
    			  });
    			  
    			});
    		  }
    
    		  if(data=='no') 
    		  {
    			  	$("#msgbox").fadeTo(200,0.1,function() //start fading the messagebox
    						{ 
    						  //add message and change the class of the box and start fading
    						  $(this).html('Falscher Benutzername/Passwort').addClass('messageboxerror').fadeTo(900,1);
    						});	
    		  		
              }
    		  
    		  else
    		  {
    		  	$("#msgbox").fadeTo(200,0.1,function() //start fading the messagebox
    			{ 
    			  //add message and change the class of the box and start fading
    			  $(this).html('Account nicht freigeschaltet').addClass('messageboxerror').fadeTo(900,1);
    			});	
    		  		
              }
    				
            });
     		return false; //not to post the  form physically
    	});
    	//now call the ajax also focus move from 
    	$("#password").blur(function()
    	{
    		$("#login_form").trigger('submit');
    	});
    });

    WARUM führt er das echo "inactive" noch aus, obwohl die Anweisung
    "if(mysql_num_rows($result2)>0)" TRUE ist?

    der login klappt ja, aber die meldung "account nicht freigeschaltet" wird trotzdem ausgegeben, noch bevor der login ausgeführt wird..

    freue mich auf das licht am ende des tunnels

    danke sehr

  • #2
    Vielleicht klärst du erst mal, in welchem Teil des gezeigten - dem PHP-Teil oder dem JavaScript-Teil - dein Problem nun eigentlich liegt.

    Und wann in welche If-Zweige gesprungen wird und ob das ggf. falsch ist, solltest du mit ein bisschen logischem Debugging auch herausbekommen können.


    Edit: Warum du überhaupt zwei Queries auf die selbe Tabelle absetzt, die vermutlich auch den selben Datensatz betreffen, solltest du auch mal erklären.
    [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

    Kommentar


    • #3
      das mit den 2 queries kommt von der unwissenheit und rührt daher, dass ich php vor gut 2 wochen angefangen habe zu lernen. dass da noch luft nach oben ist, wundert mich also nicht

      wenn ich das in eine abfrage mache, wie kann ich dann das attribut "active" auf den wert "1" prüfen, denn dann ist der account aktiv.

      das problem liegt im php-teil.

      die erste if-bedingung ist true, wenn die email gefunden wurde und das pw mit dem der datenbank übereinstimmt.

      die 2. bedingung prüft, sofern die erste true ist, ob der account aktiv ist (also das attribut "active" auf "1" ist.

      wenn auch die 2. erfüllt ist wird ne session gestartet und "yes" per echo zurückgegeben. dieses "yes" interpretiert JS als den befehl zum einloggen. was ja auch klappt, aber das

      echo "inactive";

      im php soll nicht ausgeführt werden, wenn alle bedingungen erfüllt sind.

      Kommentar


      • #4
        Zitat von tomfox Beitrag anzeigen
        wenn ich das in eine abfrage mache, wie kann ich dann das attribut "active" auf den wert "1" prüfen, denn dann ist der account aktiv.
        So, wie du es bisher auch machst ...?

        Und das Passwort erst anschliessend in PHP zu prüfen, ist auch eher ungünstig - das gehört auch schon mit in die Query rein.

        (Wie genau man das realisiert, kommt darauf an, in welcher Detailtiefe du den Nutzer über Fehler informieren willst. Man könnte bspw. einzeln darauf hinweisen, dass der Nutzername nicht existiert, oder dass das Passwort falsch ist. Damit, überhaupt zuzugeben, dass der Nutzername [nicht] existiert, eröffnet man einem Angreifer aber ggf. schon zusätzliche Rückschlussmöglichkeiten.)

        Was du auf jeden Fall machen solltest, ist das Passwort gehasht (und dabei auch „gesalzen“) in der Datenbank ablegen, und nicht im Klartext.


        das problem liegt im php-teil.
        Das Problem liegt in der kompletten Logik und Aufbau des ganzen.

        Wenn du noch nicht so viele Kenntnisse hast - dann schau doch bitte erst mal in ein paar Tutorials, was die so an hilfreichen Tipps haben, wie man das vernünftig(er) machen könnte. Dabei nicht dem erstbesten auf's Wort glauben, sondern unterschiedliche Ansätze und Argumente vergleichen.


        Und über das Stichwort SQL Injection musst du dich auch noch dringend informieren.
        [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

        Kommentar


        • #5
          reicht denn md5 nicht aus als schutz für das passwort?

          Kommentar


          • #6
            Zitat von tomfox Beitrag anzeigen
            reicht denn md5 nicht aus als schutz für das passwort?
            Ach so, dass du das schon drin hattest, habe ich übersehen.

            Die Antwort lautet: Nein.

            Zum einen ist MD5 nach aktuellem Stand der Technik nicht mehr „sicher“, und zum anderen ist es nicht hilfreich, wenn du nur das reine Passwort hashst - weil man dann in sog. rainbow tables nachschlagen kann, welcher Hash zu welchem Ausgangswert gehören könnte.
            Deshalb verwendet man wie gesagt ein sog. Salt, das man mit dem Passwort kombiniert, und anschliessend wird gehasht.
            [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

            Kommentar

            Lädt...
            X