tomcat Chriss: HTACCESS mit PHP verbinden

Hallo,

ich habe eine Frage. Ich habe in PHP ein Script entwickelt, womit ich die Authentifizierung anstelle der htaccess-Authentifizierung mit Datenbanküberprüfung durchführen kann.

Notwendig wurde das ganze, weil mein Provider (Strato) das Module mod_auth_mysql nicht eingebunden hat. Das funktioniert jetzt auch soweit, allerdings kann ich mit diesem Script nur das Script dahinter schützen und nicht, wie bei .htaccess ein komplettes Verzeichnis.

Kann man in der .htaccess definieren, dass anstelle der eigenen Authentifizierung die Authentifizierung über das PHP-Script erfolgen soll?

Danke, Chriss

  1. Hi!

    Notwendig wurde das ganze, weil mein Provider (Strato) das Module mod_auth_mysql nicht eingebunden hat. Das funktioniert jetzt auch soweit, allerdings kann ich mit diesem Script nur das Script dahinter schützen und nicht, wie bei .htaccess ein komplettes Verzeichnis.

    Aber so schwer ist die Passwort-Datei doch auch nicht zu pflegen, oder? Wäre es nicht das einfachste wenn Du Dir ein kleines Script schreibst mit dem Du die User in der Passwort-Datei genauso einfach verwalten kannst wie in einer Datenbank? Oder hast Du tatsächlich so viele User das man eine Datenbank brauchst?

    Kann man in der .htaccess definieren, dass anstelle der eigenen Authentifizierung die Authentifizierung über das PHP-Script erfolgen soll?

    Nein, das geht nicht. In PHP wird erst geladen wenn die Authentifizierung abgeschlossen ist, hast darauf also keinen Einfluss.

    Grüße
    Andreas

    1. Hallo,

      Aber so schwer ist die Passwort-Datei doch auch nicht zu pflegen, oder? Wäre es nicht das einfachste wenn Du Dir ein kleines Script schreibst mit dem Du die User in der Passwort-Datei genauso einfach verwalten kannst wie in einer Datenbank? Oder hast Du tatsächlich so viele User das man eine Datenbank brauchst?

      Es handelt sich um eine Seite für Fachhändler und diese besteht derzeit aus rund 150 Fachhändlern. Die Authentifizierung soll ja nicht nur den Zugang ermöglichen, sondern darüber wird auch egsteuert, was der jeweilige Fachhändler im Portal dahinter darf. Außerdem wird der Fachhändler persönlich begrüßt. Könnte man zwar auch über eine Passwortdatei machen, aber da ich eh die Benutzerverwaltung für das Portal habe, wäre das doppelte Arbeit.

      Nein, das geht nicht. In PHP wird erst geladen wenn die Authentifizierung abgeschlossen ist, hast darauf also keinen Einfluss.

      Ich meine ich hätte irgendwo gelesen, dass man die Authentifizierung auch über ein CGI-Script machen kann, dann muss es doch auch möglich sien, das ganze über PHP zu machen, so mächtig, wie die htaccess-Datei ist.

      Kann man denn nach der Authentifizierung, die vielleicht außerhalb des geschützen Verzeichnisses erfolgen könnte die Verarbeitung an .htaccess weitergeben und darüber dann den Zugang zum geschützen Bereich ermöglichen?

      Danke, Chriss

      1. Hi,

        Hallo,

        Aber so schwer ist die Passwort-Datei doch auch nicht zu pflegen, oder? Wäre es nicht das einfachste wenn Du Dir ein kleines Script schreibst mit dem Du die User in der Passwort-Datei genauso einfach verwalten kannst wie in einer Datenbank? Oder hast Du tatsächlich so viele User das man eine Datenbank brauchst?

        Es handelt sich um eine Seite für Fachhändler und diese besteht derzeit aus rund 150 Fachhändlern. Die Authentifizierung soll ja nicht nur den Zugang ermöglichen, sondern darüber wird auch egsteuert, was der jeweilige Fachhändler im Portal dahinter darf. Außerdem wird der Fachhändler persönlich begrüßt. Könnte man zwar auch über eine Passwortdatei machen, aber da ich eh die Benutzerverwaltung für das Portal habe, wäre das doppelte Arbeit.

        Du kannst in PHP den Usernamen der basic authentification nutzen.
        AUTH_USER oder so ähnlich heißt die Variable - guck halt einfach mit phpinfo nach...

        cu,
        Andreas

        --
        MudGuard? Siehe http://www.mud-guard.de/
        1. Hallo,

          Du kannst in PHP den Usernamen der basic authentification nutzen.
          AUTH_USER oder so ähnlich heißt die Variable - guck halt einfach mit phpinfo nach...

          Da hab ich dann aber schon wieder ein Problem, wenn ich den REMOTE_USER verwende, dann ist es schon zu spät, um noch zu überprüfen, ob der User Zugangsberechtigung hat, denn dann ist der User über htaccess schon registriert und soweit ich weiß, gibt es keine Möglichkeit, die Variablen wieder zu löschen.

          Ist es denn evtl. möglich, über PHP einen Verzeichnisschutz zu realisieren?

          Gruß, Chriss

          1. Hi,

            Da hab ich dann aber schon wieder ein Problem, wenn ich den REMOTE_USER verwende, dann ist es schon zu spät, um noch zu überprüfen, ob der User Zugangsberechtigung hat,

            Wieso soll es dann zu spät sein? Wenn er keine Berechtigung hat, kommt er nicht an das PHP-Script. Wenn er eine hat, gibt es kein Problem.

            Ist es denn evtl. möglich, über PHP einen Verzeichnisschutz zu realisieren?

            Nein.

            cu,
            Andreas

            --
            MudGuard? Siehe http://www.mud-guard.de/
            1. Hallo,

              Wieso soll es dann zu spät sein? Wenn er keine Berechtigung hat, kommt er nicht an das PHP-Script. Wenn er eine hat, gibt es kein Problem.

              Vielleicht schmeiß ich dann mein PHP-Script weg und mache es wieder mit htaccess. Da ich mit fopen, fput, fwrite, etc. bisher nicht oft gearbeitet habe, bitte ich um Hilfe.

              Da die Benutzer über das Portal angelegt werden, könnte ich mir evtl. vorstellen, dass der Benutzername und das Kennwort zusätzlich zur Datenbank nochmal in die .htpasswd geschrieben werden.

              Wie müsste denn sowas aussehen, vielleich irgendwie so?

              Über das Userregistrierungsformular bekomme ich die beiden Variablen $uname und $pass.

              $userdata = $uname.":".MD5($pass);
              $path = "../";
              $filename = ".htaccess";
              $fileaccess = fopen ($path+$filename, "w");
              $schreiben = fwrite ($fileaccess, $userdata);
              $schliessen = fclose($fileaccess);

              Danke, Chriss

          2. Hi!

            Da hab ich dann aber schon wieder ein Problem, wenn ich den REMOTE_USER verwende, dann ist es schon zu spät, um noch zu überprüfen, ob der User Zugangsberechtigung hat,

            Nein, an dieser Stelle ist es bereits geprüft!
            Ein User der sich nicht eingeloggt hat kommt erst gar nicht bis zum PHP-Script und auch  nicht zu allen anderen Dateien im Verzeichnis.

            denn dann ist der User über htaccess schon registriert und soweit ich weiß, gibt es keine Möglichkeit, die Variablen wieder zu löschen.

            Warum solltest Du das wollen? Alle User die das PHP-Script aufrufen sind bereits authentifiziert - fertig.
            Anhand von $_SERVER['REMOTE_USER'] kannst Du dann noch den Inhalt abhängig vom User anbieten.

            Du könntest z.B. die Usernamen in der Passwort-Datei auch als Primärschlüssel in der User-Tabelle der Datenbank verwenden, und dann mit der DB machen was auch immer Du willst. Wer der aktuelle User ist steht dann immer in $_SERVER['REMOTE_USER']. Musst dann halt die Passwort-Datei und Tabelle parallel plegen/bearbeiten, was aber in diesem Fall nicht das Problem sein sollte.

            So funktioniert das prinzipiell auch hier im Forum mit </my/>
            Hier konnten wir installieren was wir wollen, aber bei Deinem Provider geht das nicht und Du musst entweder damit leben, oder Dir ein Angebot suchen wo Du das bekommst was Du brauchst, bedenke wieviel Zeit Dich der Workaround kostet und wie wenig Du vermutlich dagegen durch das aktuelle Hosting-Paket sparst.

            Ist es denn evtl. möglich, über PHP einen Verzeichnisschutz zu realisieren?

            Prinzipiell kannst Du mit PHP auch nen Webserver schreiben der alles macht was Du willst, ist aber wenig sinnvoll. Einen Verzeichnisschutz kann PHP als Webserver-Modul oder CGI nicht bieten, weil es dazu nicht gedacht und eingerichtet ist. Dazu gibt es andere Module, wie Du ja weißt!
            Die einzige Möglichkeit wäre jede Datei von PHP ausgeben zu lassen, mit readfile()... aber das wäre nur meine letzte Lösung.

            Grüße
            Andreas

            1. Hallo,

              Anhand von $_SERVER['REMOTE_USER'] kannst Du dann noch den Inhalt abhängig vom User anbieten.

              Mensch genau das ist es wonach ich gefragt habe, dankeschön.

              Grüße
              Jeena Paradies

              --
              Alkoholverbot in der gesammten Bamberger Innenstadt!
              http://www.jeenaparadies.de/alkoholverbot/
          3. Hello,

            Da hab ich dann aber schon wieder ein Problem, wenn ich den REMOTE_USER verwende, dann ist es schon zu spät, um noch zu überprüfen, ob der User Zugangsberechtigung hat, denn dann ist der User über htaccess schon registriert und soweit ich weiß, gibt es keine Möglichkeit, die Variablen wieder zu löschen.

            Kleines Script für Dich.

            Die userdata.dat sollte im include_path (siehe php.ini) AUSSERHALB der Doc-Root liegen.

            Format könnte sein:

            $_userdata = array();
            $_userdata[$loginname] = array("loginname"=>"$loginname",
                                           "pw"       =>"$password",
                                           "fullname" =>"$fullname");
                                           "pages"    =>array("1,15,22,77));

            Für das Anlegen eines Users brauchst du dann eine Funktion, die diese Daten da einfach hinzufügt in das große Array und es wiedr serialisiert und abspeichert. Da ist dann eine "Datenbanktabelle für Arme".

            Scriptbeispiel

            <?PHP
            function authenticate()
            {
              Header("WWW-authenticate: basic realm="Privater Bereich"");
              Header("HTTP/1.0 401 Unauthorized");

            echo "Benutzerdaten erforderlich!";

            exit;
            }
            //-------------- Hauptprogramm -----------------------------------
            $data = file_get_contents("userdata.dat");  ## liegt im include_path

            if (!$data) die ("Benutzerdatei ist nicht zugänglich");
            $_userdata = unserialize($data);

            Dateidaten wieder freigeben, damit der Speicher wieder zur

            Verfügung steht

            unset($data);

            Wenn Userdaten gesendet werden und diese auch passen

            if(isset($_userdata[$_SERVER["PHP_AUTH_USER"])
               and ($_SERVER["PHP_AUTH_PW"]==$_userdata[$_SERVER["PHP_AUTH_USER"]["pw"]))
            {
              ## Teilarray des Users rausschneiden
              $_user=$_userdata[$_SERVER["PHP_AUTH_USER"]);

            ## und auch das Userdatenarray wieder freigeben
              unset($_userdata);

            ## und hier geht es dann weiter mit der Seitenberechnung
              include("wunderbare_Beguessungsseite");

            ## usw

            }
            else
            {
              sleep(1);         // als kleiner Schutz gegen BruteForceAttacks
              authenticate();
              exit;             // doppelt hält besser;
            }

            ####################################################################
            ?>

            <!-- hier gehts weiter mit HTML-->
            <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                 "http://www.w3.org/TR/html4/transitional.dtd">
            <html>
            <head>
              <title><?php echo "Interner Bereich von ".$_user["fullname"]; ?></title>
              <META NAME="Author" CONTENT="?">
              <META NAME="Keywords" CONTENT="?">
              <META NAME="Description" CONTENT="?">

            </head>
            <body>

            <!-- Inhalt der Datei -->

            </body>
            </html>

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            1. Hello,

              Kleine Fehler musst Du mal selbst beseitigen. Ich mus jetzt weg.

              Scriptbeispiel

              ...

              # Wenn Userdaten gesendet werden und diese auch passen
               if(isset($_userdata[$_SERVER["PHP_AUTH_USER"]])
                  and ($_SERVER["PHP_AUTH_PW"]==$_userdata[$_SERVER["PHP_AUTH_USER"]]["pw"]))

              Liebe Grüße aus http://www.braunschweig.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      2. Hello,

        Es handelt sich um eine Seite für Fachhändler und diese besteht derzeit aus rund 150 Fachhändlern. Die Authentifizierung soll ja nicht nur den Zugang ermöglichen, sondern darüber wird auch egsteuert, was der jeweilige Fachhändler im Portal dahinter darf. Außerdem wird der Fachhändler persönlich begrüßt. Könnte man zwar auch über eine Passwortdatei machen, aber da ich eh die Benutzerverwaltung für das Portal habe, wäre das doppelte Arbeit.

        Selbstverständlich geht das auch mit Authentifizierung nach der Methode Basic-Auth ohne .htaccess zu nutzen.

        Die Credentials (Name:Passwort) werden ja in jedem Request auf den entsprechenden Teilbaum der Ressourcen-Ordnung mitgeliefert.

        Und die kann men über $_SERVER["PHP_AUTH_USER"] und $_SERVER["PHP_AUTH_PW"] erfragen. Dann lädt man als nächstes die außerhalb der Doc-Root liegende Userrechte-Datei. bis zu 1000 Datensätzen à 1000 Bytes macht das mit einem Flatfile überhaupt keine Probleme. In dieser Userdatei steht ein einziges großes Datenarray. Wenn der Loginname eineindeutig ist (also Primärschlüssel), dann kann man ihn auch zum Schlüssel des Arrays machen und hat daruch mit einem gezielten Zugriff sämtliche Userparameter.

        Wenn die passen, dann kann man dem User die entsprechende Seite zusammenbauen und anbieten.

        Man kann sich dafür sogar einen eigenen Mod_Rewrite basteln, indem man das Auswertescript auf die Fehlerseiten für Access-Denied und Page-not-found legt.

        Das heißt, die statischen Templates der Seiten liegen tatsächlich unter dem entsprechenden Pfad, sind aber per HTTP nicht erreichbar, weil sie durch .htaccess gesperrt sind.

        Bei einem Zugriff auf eine solche Seite leitet der Apache ja zur Fehlerseite um, die dann bei vorhandener Authentifizierung das Template included und mit Daten füllt. Bei nicht vorhandener Authentifizierung wird das Anmeldescript included.

        Die einzige über HTTP direkt erreichbare Seite ist die index.php

        Und darüber hinaus würde ich mir für 150 Fachhändler für ca. 20Euro im Monat einen virtual Server mieten, auf dem dann alles drauf ist, was Du brauchst und wie du es brauchst. Ich empfehle da immer gerne http://www.terions.de. Auch die Traffic-Preise bei Überschreitung des Limits von 50GByte/Monat sind dort fair.

        Liebe Grüße aus http://www.braunschweig.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        1. Hallo!

          Selbstverständlich geht das auch mit Authentifizierung nach der Methode Basic-Auth ohne .htaccess zu nutzen.

          Funktioniert nur leider nicht mit der CGI-Version, und ich kenne kein shared-hosting Angebot mit PHP als Modul-Version, wäre auch unverantwortlich.

          Grüße
          Andreas

      3. Hi!

        Es handelt sich um eine Seite für Fachhändler und diese besteht derzeit aus rund 150 Fachhändlern.

        Das ist kein problem für Flatfiles, das ist sicher der Overhead der DB langsamer.

        Die Authentifizierung soll ja nicht nur den Zugang ermöglichen, sondern darüber wird auch egsteuert, was der jeweilige Fachhändler im Portal dahinter darf.

        Du kannst die Variable $_SERVER['REMOTE_USER'] auslesen, anhand der hast Du den Fachhändler eindeutig identifiziert. Wenn Du jetzt zu diesem Usernnamen aus der Passwort-Datei weitere Angaben soeichern willst, erstelle eine Tabelle in der DB und pflege die Tabelle und Passwort-Datei synchron. Das heißt wenn Du einen User anlegst sowohl in der DB als auch in der Datei, Ändern und Löschen genauso.

        |Außerdem wird der Fachhändler persönlich begrüßt.
        Speichere Vorname udn Nachname in einer Tabelle mit dem Usernamen aus der Passwortdate als Primärschlüssel, per REMOTE_USER kannst Du das dann abfragen.

        Könnte man zwar auch über eine Passwortdatei machen, aber da ich eh die Benutzerverwaltung für das Portal habe, wäre das doppelte Arbeit.

        die sich automatisieren lässt und das mit 10-50 Zeilen Code.

        Nein, das geht nicht. In PHP wird erst geladen wenn die Authentifizierung abgeschlossen ist, hast darauf also keinen Einfluss.

        Ich meine ich hätte irgendwo gelesen, dass man die Authentifizierung auch über ein CGI-Script machen kann, dann muss es doch auch möglich sien, das ganze über PHP zu machen, so mächtig, wie die htaccess-Datei ist.

        Ich kenne mich mit CGI nicht wirklich aus, jedenfalls geht es mit PHP nicht so ohne weiteres, nur mit dem Modul.

        Kann man denn nach der Authentifizierung, die vielleicht außerhalb des geschützen Verzeichnisses erfolgen könnte die Verarbeitung an .htaccess weitergeben und darüber dann den Zugang zum geschützen Bereich ermöglichen?

        Das verstehe ich nicht. Aber vermutlich "nein" ;-)

        Die Frage ist ja auch - willst Du denn auch andere Dateien außer PHP-Scripten schützen? Wenn nein brauchst Du auch keinen Verzeichnisschutz.

        Grüße
        Andreas

    2. Hallo,

      Da wir ja hier bei HTACCESS und PHP sind hätte ich auch eine Frage.

      Man gibt ja wenn man ein Verzeichniss mit .htaccess schützt einen Benutzernamen und ein Passwort ein. Nach was muss ich suchen, wenn ich mit diesem Benutzernamen innerhalb meines php Scriptes was anfangen will bzw. ihn auslesen will?

      Grüße
      Jeena Paradies

      --
      Alkoholverbot in der gesammten Bamberger Innenstadt!
      http://www.jeenaparadies.de/alkoholverbot/
      1. Hi!

        Man gibt ja wenn man ein Verzeichniss mit .htaccess schützt einen Benutzernamen und ein Passwort ein. Nach was muss ich suchen, wenn ich mit diesem Benutzernamen innerhalb meines php Scriptes was anfangen will bzw. ihn auslesen will?

        Tipp: lege in einem per .htaccess geschützten Verzeichnis eien Datei mit phpinfo(); an. Da wirst Du immer alles finden worauf Du zugreifen kannst  und wie die Variable heißt.

        In diesem Fall wäre das $_SERVER['REMOTE_USER']

        Grüße
        Andreas

        1. Hallo,

          Tipp: lege in einem per .htaccess geschützten Verzeichnis eien Datei mit phpinfo(); an. Da wirst Du immer alles finden worauf Du zugreifen kannst  und wie die Variable heißt.
          In diesem Fall wäre das $_SERVER['REMOTE_USER']

          Danke für den Tipp, jetzt komme ich viel weiter mit meinem Admincenter :-) Jetzt wird man nicht mehr bei jedem Pfurz das elendlange Passwort eingeben müssen.

          Ich mach mich gleich an die Arbeit.

          Grüße
          Jeena Paradies

          --
          Alkoholverbot in der gesammten Bamberger Innenstadt!
          http://www.jeenaparadies.de/alkoholverbot/