möP: Loginscript funktioniert nicht... wieso?

Hallo.

Folgendes:
Ich habe ien Loginscript. Wenn ich dort meinen Namen und Pw eingebe erscheint immer fehler.php obwohl das pw und der name _richtig 100%__nicht falsch__ _ eingegeben wurde.

Das Skript geht so vor:
Durchsuche Tabelle xxxNR(1-3) nach user wo user oder userid = $name
falls gefunden $aktNR(1-3) = 0 falls nicht $aktNR(1-3) = 1 mache das gleiche mit der nächsten Tabelle.
Wenn alle durchsind und es nicht gefunden wurde haben$akt1 und 2 und 3 den Wert 1 und es wir dzu fehler.php weitergeleitet. Falls auch nur  einer nicht den Wert 1 hat sondern z.B. wie hier dann 0, dann wird zu online.php weitergeleitet.

// Loginskript
if($action=='login'){
 $name=$_POST['user'];
        $pwd=$_POST['pwd'];
 $c=mysql_connect($host,$user,$pw);
 mysql_select_db('xxx',$c);

$query="SELECT user FROM xxx1 WHERE user='$name' OR userid='$name' AND pwd='$pwd'";
 $sql=mysql_query($query);
 if(mysql_num_rows($sql)==1){
  $akt1=0;
 }elseif(mysql_num_rows($sql)!=1) {
  $akt1=1;
  $query="SELECT user FROM xxx2 WHERE user='$name' OR userid='$name' AND pwd='$pwd'";
  $sql2=mysql_query($query);
  if(mysql_num_rows($sql2)==1){
   $akt2=0;
  }elseif(mysql_num_rows($sql2)!=1) {
   $akt2=1;
   $query="SELECT user FROM xxx3 WHERE user='$name' OR userid='$name' AND pwd='$pwd'";
   $sql3=mysql_query($query);
   if(mysql_num_rows($sql3)==1){
    $akt3=0;
   }elseif(mysql_num_rows($sql3)!=1) {
    $akt3=1;
   }
  }
 }
 if($akt1=1&&$akt2=1&&$akt3=1){
  header("Location: fehler.php");
 }else{
  header("Location: online.php");
 }
}

Wenn das steht if($akt1=1&&$akt2=1&&$akt3=1) {Anweisung},
dann heißt das doch das _nur_ wenn
$akt1 _und_ $akt2 _und_ $akt3 den Wert 1 haben, die Anweisung passiert oder?

Was mach ich her falsch das es nicht geht?

mfg

Danke.

möP

  1. lass dir die zwischenwerte ausgeben - das ist das A nd O der fehlersuche , des weiteren - die abfrage nach der anzahl der zeilen.. icht SO toll - ändere es in die abfrage nach dem pw wo username=$usernam und prüfe es DANN mit vergleich. es sichert gegen manche fehler ab.
    3) ein wenig zu ..sperrig der script.. zerschlage es in 3 einzelne if's  :-)oder mache es agr in einem rutsch bzw. sortiere tabellne nahc anfangsbuchstaben der usernamen und leite es entsprechend.
    MFG
    bleicher

    --
    __________________________-
    Menschen an sich , sind nicht schlecht - es sind nur ihre Taten (c).
  2. echo $begrüßung;

    Ich habe ien Loginscript. Wenn ich dort meinen Namen und Pw eingebe erscheint immer fehler.php obwohl das pw und der name _richtig 100%__nicht falsch__ _ eingegeben wurde.

    Solche Fehler sucht man, indem man sich die Inhalte der Variablen ausgibt. Ebenso kann man sich die Ergebnisse von Ausdrücken ausgeben lassen. Geeignete Funktionen sind neben echo und print() vor allem var_dump(). var_dump() gibt neben dem Wert auch noch den Typ aus und ist bei der Anzeige boolscher Werte genauer (true/false statt 1/nix). Für Arrays und Objekte ist auch noch print_r() geeignet.

    Ansonsten vermisse ich das Reagieren auf Fehlerzustände in deinem Script.

    $c=mysql_connect($host,$user,$pw);
    mysql_select_db('xxx',$c);

    Wenn der Connect misslingt (falsche Logindaten, Datenbank hat grad Pause, ...) gibt mysql_connect() keine Ressourcenkennung sondern false zurück. Das wiederum mag weder mysql_select_db() noch mögen es die anderen mysql_*-Funktionen als Parameter haben. PHP quittiert das dann mit einer "not a valid argument"-Fehlermeldung.

    $query="SELECT user FROM xxx1 WHERE user='$name' OR userid='$name' AND pwd='$pwd'";
    $sql=mysql_query($query);
    if(mysql_num_rows($sql)==1){

    Ebenso ist es bei mysql_query().

    Den OR-Ausdruck willst du sicherlich in Klammern setzen. Da das AND eine höhere Priorität hat als das OR, wird zuerst userid und pwd ausgewertet und das Ergebnis dessen anschließend noch mit dem user-Vergleich "geORt". Wenn user gleich $name ist, wird damit dein Ausdruck schon wahr.

    Nehmen wir mal an, dass du nun die Klammern richtig gesetzt hast. Was passiert eigentlich mit deinem Loginvorgang, wenn jemand in dein Passwortfeld ' OR 1 OR ' (inklusive der ' ) eingibt?

    Wenn das steht if($akt1=1&&$akt2=1&&$akt3=1) {Anweisung},
    dann heißt das doch das _nur_ wenn
    $akt1 _und_ $akt2 _und_ $akt3 den Wert 1 haben, die Anweisung passiert oder?

    Nein, heißt es nicht. Du solltest dir nochmal den Unterschied zwischen Zuweisungs- und Vergleichsoperatoren unter PHP anschauen.

    Es gibt einen kleinen Trick, wie man den Parser nutzen kann, einem solche Fehler zu zeigen. Wenn man den konstanten Ausdruck links vom versehentlich verwendeten Zuweisungsoperator notiert und die Variable rechts davon ergibt das eine ungültige Zuweisung, die der Parser ankreidet. Aber wenn man schon daran denkt, das so zu notieren, denkt man sicher auch daran, den richtigen Operator zu verwenden.

    echo "$verabschiedung $name";

    1. echo $begrüßung;

      Ich habe ien Loginscript. Wenn ich dort meinen Namen und Pw eingebe erscheint immer fehler.php obwohl das pw und der name _richtig 100%__nicht falsch__ _ eingegeben wurde.

      Solche Fehler sucht man, indem man sich die Inhalte der Variablen ausgibt. Ebenso kann man sich die Ergebnisse von Ausdrücken ausgeben lassen. Geeignete Funktionen sind neben echo und print() vor allem var_dump(). var_dump() gibt neben dem Wert auch noch den Typ aus und ist bei der Anzeige boolscher Werte genauer (true/false statt 1/nix). Für Arrays und Objekte ist auch noch print_r() geeignet.

      Okay.

      Ansonsten vermisse ich das Reagieren auf Fehlerzustände in deinem Script.

      Sind drin ;) Hab ich hier nur rausgemacht.

      $query="SELECT user FROM xxx1 WHERE user='$name' OR userid='$name' AND pwd='$pwd'";
      $sql=mysql_query($query);
      if(mysql_num_rows($sql)==1){

      Ebenso ist es bei mysql_query().

      Ebenso.

      Den OR-Ausdruck willst du sicherlich in Klammern setzen. Da das AND eine höhere Priorität hat als das OR, wird zuerst userid und pwd ausgewertet und das Ergebnis dessen anschließend noch mit dem user-Vergleich "geORt". Wenn user gleich $name ist, wird damit dein Ausdruck schon wahr.

      Wie in Klammern setzen? Wie genau?

      Nehmen wir mal an, dass du nun die Klammern richtig gesetzt hast. Was passiert eigentlich mit deinem Loginvorgang, wenn jemand in dein Passwortfeld ' OR 1 OR ' (inklusive der ' ) eingibt?

      Das PW wird vorher verschlüsselt. Es ist also nicht möglich das so ein Fall eintrifft.

      Wenn das steht if($akt1=1&&$akt2=1&&$akt3=1) {Anweisung},
      dann heißt das doch das _nur_ wenn
      $akt1 _und_ $akt2 _und_ $akt3 den Wert 1 haben, die Anweisung passiert oder?

      Nein, heißt es nicht. Du solltest dir nochmal den Unterschied zwischen Zuweisungs- und Vergleichsoperatoren unter PHP anschauen.

      Ouh *vorn Kopg schlag*. Danke.

      Es gibt einen kleinen Trick, wie man den Parser nutzen kann, einem solche Fehler zu zeigen. Wenn man den konstanten Ausdruck links vom versehentlich verwendeten Zuweisungsoperator notiert und die Variable rechts davon ergibt das eine ungültige Zuweisung, die der Parser ankreidet. Aber wenn man schon daran denkt, das so zu notieren, denkt man sicher auch daran, den richtigen Operator zu verwenden.

      $verabschiedung ="<p>mfg</p>";
      $name="<p>Phil Z.</p>";

      echo "$verabschiedung $name";

      1. echo $begrüßung;

        $query="SELECT user FROM xxx1 WHERE user='$name' OR userid='$name' AND pwd='$pwd'";
        Den OR-Ausdruck willst du sicherlich in Klammern setzen. Da das AND eine höhere Priorität hat als das OR, wird zuerst userid und pwd ausgewertet und das Ergebnis dessen anschließend noch mit dem user-Vergleich "geORt". Wenn user gleich $name ist, wird damit dein Ausdruck schon wahr.
        Wie in Klammern setzen? Wie genau?

        Ohne Klammern wirkt das Statement so, als ob sie wie folgt gesetzt wären:

        SELECT user FROM xxx1 WHERE user='$name' OR (userid='$name' AND pwd='$pwd')

        Deswegen:

        SELECT user FROM xxx1 WHERE (user='$name' OR userid='$name') AND pwd='$pwd'

        Nehmen wir mal an, dass du nun die Klammern richtig gesetzt hast. Was passiert eigentlich mit deinem Loginvorgang, wenn jemand in dein Passwortfeld ' OR 1 OR ' (inklusive der ' ) eingibt?
        Das PW wird vorher verschlüsselt. Es ist also nicht möglich das so ein Fall eintrifft.

        Nun, davon war in deinem Script nichts zu sehen. Das war sehr schön gegen SQL-Injection anfällig.
        Vielleicht tritt diese Situation bei anderen Fällen auf. Vielleicht sorgt auch dein Verschlüsslungsalgorithmus dafür, dass mal ein ' im Ergebnis entsteht, das gibt dann "nur" einen Syntax-Fehler. Besser ist es, alle Stringwerte vor dem Einfügen in die Query mit mysql_real_escape_string() zu behandeln (und dabei beachten, dass Magic Quotes hier kontraproduktiv wirksam sein können).

        echo "$verabschiedung $name";

        1. Danke. =)

          Hast mir sehr geholfen auch wenns nurn richtig dumemr Anfängerfehler war -.-°.

          mfg

          Phil

  3. hallo

    if($akt1=1&&$akt2=1&&$akt3=1){

    richtig wäre
    if($akt1==1&&$akt2==1&&$akt3==1) {Anweisung}
    hat zwar mein vorgänger auch indirekt geschrieben aber hier nochmal explizit..gruß juergen