Andi: Header Authentication funzt ned

Moin moin
Kann mir einer von euch veraten warum der untenfolgende Code nicht funktioniert?
die beiden variablen $php_auth_user und $php_auth_pw werden korrekt gefüllt, das habe ich überprüft, aber wenn ich in den dialog die gültigen daten eingebe, passiert einfach nix und nach 3x bricht er ab!
Warum?
Mfg Andi

if($message_log=="Offline")
   {
    $auth=false;
    $p = OCIParse($logon, "select * from T_MITARBEITER");
      OCIExecute($p, OCI_DEFAULT);
      while (OCIFetch($p))
    {
     $PHP_AUTH_USER = ociresult($p,"NACHNAME");
       $PHP_AUTH_PW = ociresult($p,"PASSWORT");

//      echo "username: ".$PHP_AUTH_USER."<BR>";
//      echo "password: ".$PHP_AUTH_PW."<BR>";

if ( ! $auth )
    {
       header( 'WWW-Authenticate: Basic realm="Private"' );
       header( 'HTTP/1.0 401 Unauthorized' );
       echo 'Authorization Required.';
        exit;
    }
    else
    {
       echo '<P>You are authorized!</P>';
    }
   }
  }

  1. Hi,
    du solltest vielleicht noch $auth auf true setzen, wenn die Daten stimmen...
    Der Yeti

    --
    Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
    Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
    Und bin so klug als wie zuvor!
    sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|
    http://community.de.selfhtml.org/fanprojekte/selfcode.htm
    1. Sers

      du solltest vielleicht noch $auth auf true setzen, wenn die Daten stimmen.

      Soweit kommt er gar ned, er vergleicht die eingegeben daten gar ned mit den beiden variablen

      1. Hallo Andi,

        du solltest vielleicht noch $auth auf true setzen, wenn die Daten stimmen.

        Soweit kommt er gar ned, er vergleicht die eingegeben daten gar ned mit den beiden variablen

        Bitte versehe Dein Skript doch mit Kommentaren.
        Der einzige Vergleich, der in Deinem Skript vorkommt ist in der ersten Zeile:

        if($message_log=="Offline")

        Freundlicherweise verrätst Du uns nicht, welchen Inhalt die Variable $message_log hat.
        Welchen Zweck der folgende Code hat, entgeht mir ebenfalls.

        Du führst eine Datenbankabfrage durch,
        durchläufst anschliessend das Ergebnis
        Da $auth auf jeden Fall den Wert "false" besitzt,
        (siehe Yetis Posting)
        bricht die Schleife beim ersten Durchlauf bereits ab,
        nachdem Du entsprechende Header versendet hast.

        Wie soll hier je eine Authentifizierung erfolgen?

        Ich würde für den Benutzernamen/Passwortvergleich eine Funktion schreiben, mit etwa dieser Schnittstelle:

        function bool_check_login

        Übergabe: Benutzername, Passwort
        Rückgabe: true, wenn Benutzername/Passwortkombination in DB vorhanden
                  false, sonst

        Ob Du die Benutzereingaben innerhalb dieser Funktion oder außerhalb dieser Funktion auf SQL-Injection prüfst, liegt an Dir.

        Freundliche Grüsse,

        Vinzenz

        1. soda ich habe mich durch eure beiträge und auch sonst etwas schlauer gemacht und den code verbessert, er macht jedoch immer noch mucken.

          die authorisierung funktioniert nämlich nur mit dem letzten user der datenbank.

          $message_log ist nur ein Zeiger ob der User bereits eingeloggt ist oder nicht.

          if($message_log=="Offline")
             {
              $auth=false;
          // Usernamen mit Passwörtern aus der DB holen
              $p = OCIParse($logon, "select * from T_MITARBEITER");
                OCIExecute($p, OCI_DEFAULT);
                while (OCIFetch($p))
              {
               $c_user = ociresult($p,"NACHNAME");
                 $c_pw = ociresult($p,"PASSWORT");
                }
          //     echo "Test c_user:".$c_user."<br>",
          //            "Test c_pw:".$c_pw."<br>";

          if ( ! $auth )
              {
                 header( 'WWW-Authenticate: Basic realm="Private"' );
                 header( 'HTTP/1.0 401 Unauthorized' );

          if($_SERVER['PHP_AUTH_USER']==$c_user & $_SERVER['PHP_AUTH_PW']==$c_pw)
               { setcookie('log', $_SERVER['PHP_AUTH_USER'],time()+3600);
                echo '<P>You are authorized!</P>';
                $auth=true;
               }
               else
               { echo 'Authorization Required.';
                echo "Test c_user:".$c_user."<br>",
                      "Test c_pw:".$c_pw."<br>",
                      "Test server_user:".$_SERVER['PHP_AUTH_USER']."<br>",
                      "Test server_pw:".$_SERVER['PHP_AUTH_PW']."<br>",
                   exit;
               }
              }

          }

          Verbesserungsvorschläge?
          Mfg
          Andi

          1. Hi,

            Verbesserungsvorschläge?

            Ja, belege die Vergleichsvariablen nicht bei jedem Durchlauf mit den Ergebnissen der Datenbankabfrage, dadurch werden nämlich alle Benutzer nacheinander dort reingeschrieben und überschrieben. Stehen bleibt vor dem Vergleich dann eben nur der letzte Benutzer.

            Folge meinem Tipp und formuliere die Datenbankabfrage unter Einbeziehung des (schon bekannten) Benutzernamens und frage nur das Passwort ab. Wenn das Ergebnis der SQL-Abfrage leer ist (0 Zeilen), existiert der Benutzer nicht.

            Der Yeti

            --
            Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
            Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
            Und bin so klug als wie zuvor!
            sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|
            http://community.de.selfhtml.org/fanprojekte/selfcode.htm
            1. Sers

              Ok vielen dank, habe mit deinem tipp das skript soweit hinbekommen:
                 if($message_log=="Offline")
                 {
                   setcookie('log','',time()-5000);
                    header( 'WWW-Authenticate: Basic realm="Private"' );
                     header( 'HTTP/1.0 401 Unauthorized' );
                     $c_user=$_SERVER['PHP_AUTH_USER'];

              $p = OCIParse($logon, "select PASSWORT from T_MITARBEITER where NACHNAME='$c_user'");
                    OCIExecute($p, OCI_DEFAULT);
                    while (OCIFetch($p))
                  {
                     $c_pw = ociresult($p,"PASSWORT");
                   }

              if ($c_pw==$_SERVER['PHP_AUTH_PW'])
                  { setcookie('log','',time()-5000);
                   setcookie('log',$c_user,time()+3600);
                   echo "Test user".$u_user;
                  }
                  else
                   { echo 'Authorization Required.';
                       exit;
                   }

              }

              Nun aber tritt ein anderes problem auf, dass mich absolut vor rätsel stellt:
              Wenn der User angemeldet ist, wird das in dem Cookie mit seinem Namen als inhalt festgeschrieben.
              Folgedes Phänomen:
              Es existiert kein Cookie: User 1 logt sich ein ist als User 1 eingeloggt, beim Ausloggen wird das cookie zerstört, gibt user 2 anschließend seine Daten zum einloggen an wird dennoch das Cookie mit dem Namen von User 1 gefüllt, zerstört man auch dieses Cookie und logt sich User 3 ein, wird das Cookie mit dem Namen von User 2 gefüllt u.s.w. u.s.w.
              ..... hä??

              Logout:
               if (isset($_POST['data']['logoff']))
                { setcookie('log','',time()-5000);
                 }

              1. Hi,

                Nun aber tritt ein anderes problem auf, dass mich absolut vor rätsel stellt:
                Wenn der User angemeldet ist, wird das in dem Cookie mit seinem Namen als inhalt festgeschrieben.
                Folgedes Phänomen:
                Es existiert kein Cookie: User 1 logt sich ein ist als User 1 eingeloggt, beim Ausloggen wird das cookie zerstört, gibt user 2 anschließend seine Daten zum einloggen an wird dennoch das Cookie mit dem Namen von User 1 gefüllt, zerstört man auch dieses Cookie und logt sich User 3 ein, wird das Cookie mit dem Namen von User 2 gefüllt u.s.w. u.s.w.
                ..... hä??

                Logout:
                 if (isset($_POST['data']['logoff']))
                  { setcookie('log','',time()-5000);
                   }

                Das ist blöd. Ich arbeite sowieso nie gerne mit Cookies, sondern lieber mit Sessions wo beim Client im Cookie nur die Session-ID gespeichert wird (oder, wenn dieser keine Kekse mag, wird die SID an jeden Link drangehangen).
                Das klappt auch wunderbar, wenn ich nach erfolgreichem Login $_SESSION["user"] setze und beim Logout http://php.net/session_destroy mache. Man muss dann nur bei jeder Seite, die die Daten abrufen will, als allererstes ein http://php.net/session_start machen.

                Probier's vielleicht mal damit!

                Der Yeti

                --
                Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
                Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
                Und bin so klug als wie zuvor!
                sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|
                http://community.de.selfhtml.org/fanprojekte/selfcode.htm
                1. Sers
                  Also ich habe jetzt mal meinen Code auf deinen Rat hin auf ein Session system umgeschrieben!
                  Das funktioniert auch gut, nur leider, und ich komm einfach nicht dahinter warum, tritt der selbe Fehler wieder auf!

                  ?!?!? Erklärung ?!?!?

                  <?

                  session_start();
                       $c_cookie=$_SESSION['user'];

                  // connect to database
                      $username=****;
                      $password=****;
                      $tnsname=****;
                      $logon=OCILogon($username,$password,$tnsname);

                  // Check Status...
                     $message_log="Offline";
                     $s = OCIParse($logon, "select NACHNAME from T_MITARBEITER");
                     OCIExecute($s, OCI_DEFAULT);
                     while (OCIFetch($s))
                     {
                       $c_user=ociresult($s, "NACHNAME");

                  if($c_user == $c_cookie)
                       {$message_log="Online";}
                    }
                     if($message_log=="Offline")
                     {
                      header( 'WWW-Authenticate: Basic realm="Private"' );
                        header( 'HTTP/1.0 401 Unauthorized' );

                  $c_user=$_SERVER['PHP_AUTH_USER'];

                  $p = OCIParse($logon, "select PASSWORT from T_MITARBEITER where NACHNAME='$c_user'");
                        OCIExecute($p, OCI_DEFAULT);
                        while (OCIFetch($p))
                      {
                         $c_pw = ociresult($p,"PASSWORT");
                       }

                  if ($c_pw==$_SERVER['PHP_AUTH_PW'])
                      { $_SESSION['status'] = 'Online: ';
                       $_SESSION['user'] = $c_user;
                      }
                      else
                       { echo 'Authorization Required.';
                           exit;
                       }

                  }

                  Lg Andi

                  1. Hi,

                    Sers
                    Also ich habe jetzt mal meinen Code auf deinen Rat hin auf ein Session system umgeschrieben!
                    Das funktioniert auch gut, nur leider, und ich komm einfach nicht dahinter warum, tritt der selbe Fehler wieder auf!

                    ?!?!? Erklärung ?!?!?

                    Das sehe ich beim besten Willen auch nicht auf den ersten Blick ...
                    Mir fällt nur auf, dass die Online-Überprüfung ein wenig umständlich ist. Schließlich ist ein Benutzer auch online if (isset($_SESSION["user"])).

                    Wenn ich session_destroy() auf der Logoutseite einbaue, wird die Session zerstört und eine komplett neue aufgebaut. Diese _kann_ dann den alten Benutzernamen gar nicht enthalten.
                    Versuch mal zu debuggen, indem du <?=session_id()?> machst.

                    Der Yeti

                    --
                    Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
                    Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
                    Und bin so klug als wie zuvor!
                    sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|
                    http://community.de.selfhtml.org/fanprojekte/selfcode.htm
                    1. Hello,

                      Das sehe ich beim besten Willen auch nicht auf den ersten Blick ...
                      Mir fällt nur auf, dass die Online-Überprüfung ein wenig umständlich ist. Schließlich ist ein Benutzer auch online if (isset($_SESSION["user"])).

                      Das Vorhandensein einer Session hat nicht mit dem "Online-Status" eines Users zu tun.
                      Genauso hat das Nichtvorhandensein von $_SESSION[xyz]-Variablen nicht zwangsläufig etwas mit dem Vorhandensein einer Session zu tun.

                      Das Vorhandesein von $_SESSION hat allerdings zwangsläufig etwas mit dem Vorhandensein der Variable  Svar = session_name() entwedr in $_GET, oder in $_POST oder in $_COOKIE zu tun.

                      Sessions sind die Basis
                      Darauf setzen die Logins auf

                      Harzliche Grüße aus http://www.annerschbarrich.de

                      Tom

                      --
                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                      Nur selber lernen macht schlau
                      1. Hi,

                        Das Vorhandensein einer Session hat nicht mit dem "Online-Status" eines Users zu tun.
                        Genauso hat das Nichtvorhandensein von $_SESSION[xyz]-Variablen nicht zwangsläufig etwas mit dem Vorhandensein einer Session zu tun.

                        Wenn man das Konzept versteht, schon. Beim Login werden Session-Variablen gefüllt und beim Logout wird die Session zerstört (wodurch auch alle Variablen verschwinden).
                        Prinzipiell hast du recht, für den Computer besteht diese Beziehung nicht. Aber durch das darüberliegende Konzept für den Menschen schon.

                        Der Yeti

                        --
                        Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
                        Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
                        Und bin so klug als wie zuvor!
                        sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|
                        http://community.de.selfhtml.org/fanprojekte/selfcode.htm
                        1. Hello,

                          Hi,

                          Das Vorhandensein einer Session hat nicht mit dem "Online-Status" eines Users zu tun.
                          Genauso hat das Nichtvorhandensein von $_SESSION[xyz]-Variablen nicht zwangsläufig etwas mit dem Vorhandensein einer Session zu tun.

                          Wenn man das Konzept versteht, schon. Beim Login werden Session-Variablen gefüllt und beim Logout wird die Session zerstört (wodurch auch alle Variablen verschwinden).
                          Prinzipiell hast du recht, für den Computer besteht diese Beziehung nicht. Aber durch das darüberliegende Konzept für den Menschen schon.

                          Auch wenn man das Konzept versteht gibt es da keine zwangsweisen Abhängigkeiten, oder eben gerade nicht.

                          Man kann die Sessionvariablen auch stehenlassen, um dem User zu ermöglichen, wieder darauf aufzusetzen. Wie man das macht, ist sekundär. Aber ein Login (Zugang zu Systemdiensten und weiteren Daten) hat damit nichts zu tun. Allerdings wird die Session dafürt genutzt, den Client wiederzuerkennen. Ein User kann auch mehrere Sessions gleichzeitig von einem Client aus führen, und sogar mit derselben Applikation.

                          Das bringt einen dann zu der Frage: Was war zuerst da? Die Session oder die User-Identifikation?

                          Harzliche Grüße aus http://www.annerschbarrich.de

                          Tom

                          --
                          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                          Nur selber lernen macht schlau
      2. Hi,

        Soweit kommt er gar ned, er vergleicht die eingegeben daten gar ned mit den beiden variablen

        Wie soll er das auch, wenn du ihm das nicht sagst? Die einzige Stelle, wo etwas annähernd richtiges steht, ist:
        $PHP_AUTH_USER = ociresult($p,"NACHNAME");
        $PHP_AUTH_PW = ociresult($p,"PASSWORT");

        echo "username: ".$PHP_AUTH_USER."<BR>";
        echo "password: ".$PHP_AUTH_PW."<BR>";

        Allerdings weist du hier den (bei register_globals off undefinierten) Variablen $PHP_AUTH_USER und $PHP_AUTH_PW die ganze Zeit die Ergebnisse deiner DB-Abfrage zu. D.h. am Ende der while-Schleife stehen die "Credentials" des letzten Users aus der Datenbank in den Variablen.
        Danach folgt sofort if (!$auth), was gar nicht wahr sein kann, da du es nie angerührt hast nach deinem Aufruf von $auth = false.

        Du solltest eher den $PHP_AUTH_USER in die WHERE-Klausel der Datenbankabfrage einbeziehen und dann sagen:
        if (ociresult($p,"PASSWORT") == $PHP_AUTH_PW)       // noch besser über crypt!
           $auth = true;

        Der Yeti

        --
        Habe nun, ach! WInfo, BWL, und Mathe, Und leider auch Info!
        Durchaus studiert, mit heißem Bemühn. Da steh' ich nun, ich armer Thor!
        Und bin so klug als wie zuvor!
        sh:( fo:| ch:? rl:? br:< n4:& ie:( mo:| va:| de:[ zu:) fl:| ss:) ls:< js:|
        http://community.de.selfhtml.org/fanprojekte/selfcode.htm
  2. Hello,

    Moin moin
    Kann mir einer von euch veraten warum der untenfolgende Code nicht funktioniert?
    die beiden variablen $php_auth_user und $php_auth_pw werden korrekt gefüllt, das habe ich überprüft, aber wenn ich in den dialog die gültigen daten eingebe, passiert einfach nix und nach 3x bricht er ab!
    Warum?
    Mfg Andi

    if($message_log=="Offline")
       {
        $auth=false;
        $p = OCIParse($logon, "select * from T_MITARBEITER");
          OCIExecute($p, OCI_DEFAULT);
          while (OCIFetch($p))
        {

    $PHP_AUTH_USER = ociresult($p,"NACHNAME");
            $PHP_AUTH_PW = ociresult($p,"PASSWORT");

    hier werden doch die Variablen aus der DB gefüllt (zugewiesen), oder sehe ich das falsch?

    Du müsstest doch eher die aus dem Request mit denen aus der DB _vergleichen_

    wenn register_glöbals auf off steht, sind die Werte sowieso nur noch in $_SERVER['PHP_AUTH_*']

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
  3. Servus

    Danke habe das Problem gelöst.

    Es lag im cache, wo immer die daten vom letzten Benutzer gespeichert wurden.
    -->
      <meta http-equiv="pragma" content="no-cache">
      <meta http-equiv="expires" content="-1">
    -->
    Thx Anid