Marco: Bilder schützen

Hi Forum,

ich möchte eine private Bildergalerie erstellen und habe die soweit fertig geschrieben, jetzt fehlt mir noch ein Passwortschutz.

Ich möchte diesen über Session-IDs realisieren. Da ich aber eine sehr durchschaubare Ordnerstruktur habe, sollen die Bilder zusätzlich geschützt werden, damit wer die Adresse kennt sie nicht einfach direkt eintippen und die Bilder anschauen kann.
Welche Methode ist hier die beste?

Bisher habe ich den kompletten Passwortschutz mit HTTP-Auth realisiert, das macht aber das ändern eines Passwortes oder allgemein die Userverwaltung sehr kompliziert.

MfG,

Marco

  1. Hallo,

    Bisher habe ich den kompletten Passwortschutz mit HTTP-Auth realisiert, das macht aber das ändern eines Passwortes oder allgemein die Userverwaltung sehr kompliziert.

    HTTP-Auth ist ansich schon die beste und einfachste Lösung. Wenn Du schreibst, daß bei Dir die Userverwaltung sehr kompliziert ist, dann machst Du etwas falsch, aber genau zu wissen, wie Du es implementiert hast, wäre schon wichtig ;)

    Gruß aus Berlin!
    eddi

    1. Hallo eddi,

      mein Problem ist, dass ich mit einer Eingabemaske neue Galerien anlegen möchte und dabei jeweils verschiedene User zulassen will.

      Der User soll außerdem das mir unbekannte Passwort selbst ändern können, was mit HTTP-Auth unnötig kompliziert wird. Da ist das ändern einer MySQL Datenbank (für mich) wesentlich einfacher.

      Gruß,

      Marco

      1. Hallo,

        Der User soll außerdem das mir unbekannte Passwort selbst ändern können, was mit HTTP-Auth unnötig kompliziert wird. Da ist das ändern einer MySQL Datenbank (für mich) wesentlich einfacher.

        Ein PHP-Script kann Dir diese komplexe Arbeit völlig abnehmen. Passwörter lassen sich mit einem Script von Dennis generieren. Den Rest, den Du mit...

        mein Problem ist, dass ich mit einer Eingabemaske neue Galerien anlegen möchte und dabei jeweils verschiedene User zulassen will.

        ...angerissen hast, solltest Du in Teilprobleme zerlegen und im Falle eines Nichtweiterkommens detailiert (bitte mit Quellcode des Versuchs) in diesem Thread schildern

        Gruß aus Berlin!
        eddi

        1. Hallo,

          danke für deine Antworten, vielleicht bleibe ich doch bei HTTP-Auth.
          Das Problem hierbei ist, dass wenn ich ein Passwort ändern will, dieses ja in der .htpasswd (oder wie die Passwort-Datei auch heißen mag) ändern muss, und zwar nur wenn der User ein richtiges Passwort angibt. Dieses Passwort bleibt mir jedoch unbekannt.

          Für jede Galerie eine .htaccess Datei anzulegen, in der unter require user die zugelassenen User gelistet werden ist nicht das Problem.

          MfG,

          Marco

          1. Re:

            Das Problem hierbei ist, dass wenn ich ein Passwort ändern will, dieses ja in der .htpasswd (oder wie die Passwort-Datei auch heißen mag) ändern muss, und zwar nur wenn der User ein richtiges Passwort angibt. Dieses Passwort bleibt mir jedoch unbekannt.

            Was kümmert Dich das bereits angegebene Passwort? Der Webserver prüft doch, ob das Passwort stimmt. Jeder Nutzer, der sich erfolgreich authentifiziert hat, kann sein Passwort mittels eines ebenfalls im Schutzbereich platzierten Script abändern. Den Usernamen holst Du Dir über die Umgebungsvariable $_ENV['REMOTE_USER'] und das neue Passwort über eine Formulareingabe; Admin - sprich Du - kann nur eben jedes Userpasswort ändern. Das ist alles in allem keine große sache.

            Für jede Galerie eine .htaccess Datei anzulegen, in der unter require user die zugelassenen User gelistet werden ist nicht das Problem.

            schön ;)

            Gruß aus Berlin!
            eddi

            1. Hi,

              ich verstehe nicht was du meinst. Wie ich mir dann den Usernamen hole ist klar. Aber das Passwort wird ja in der .htpasswd in der Form username:passwort gespeichert. Wie soll ich das mit einem Skript ändern, ohne das alte Passwort zu kennen??

              MfG,
              Marco

              1. Re:

                ich verstehe nicht was du meinst. Wie ich mir dann den Usernamen hole ist klar. Aber das Passwort wird ja in der .htpasswd in der Form username:passwort gespeichert. Wie soll ich das mit einem Skript ändern, ohne das alte Passwort zu kennen??

                Du mußt es nicht kennen, um es abzuändern. Der Webserver überprüft doch, ob das Passwort stimmt. (So schwer zu begreifen kann das doch gar nicht sein ^^ )

                Gruß aus Berlin!
                eddi

                1. Hi nochmal,

                  anscheinend ist es für mich zu schwer^^

                  Der User soll sein eigenes Passwort ändern können. Dieses steht in der .htpasswd in der Form username:passwort und muss dort geändert werden, damit das alte Passwort nicht mehr geht, sondern das neue. Dass heißt die Zeile mit dem Benutzernamen und Passwort muss gegen eine andere ausgetauscht werden. Um das mit PHP zu machen muss die Zeile doch bekannt sein oder??

                  MfG,

                  Marco

                  1. Hallo Marco,

                    Der User soll sein eigenes Passwort ändern können.

                    Klar.

                    Um das mit PHP zu machen muss die Zeile doch bekannt sein oder??

                    Nur der Benutzername. Und der steht ja am Zeilenanfang. Das (alte) Passwort kann dir egal sein, denn der HTTP-AUTH-Mechanismus hat ja schon sichergestellt, dass der *richtige* User mit dem *richtigen* Passwort da ist. Also wo ist jetzt noch das Problem?

                    Schönen Abend noch,
                     Martin

                    --
                    Paradox ist, wenn jemand eingefleischter Vegetarier ist.
                    1. Hi Martin,

                      danke für deine Antwort. Das ist klar, jetzt ist mir nur noch nicht klar wie das PHP Skript die richtige Zeile findet und ersetzt, also mit welcher Funktion. Damit Dateien zu ändern hatte ich leider schon genug Probleme^^

                      Hättest du einen kleinen Tipp für mich?

                      Schönen Abend noch,

                      Gleichfalls,

                      Marco

                      1. Hallo,

                        danke für deine Antwort. Das ist klar, jetzt ist mir nur noch nicht klar wie das PHP Skript die richtige Zeile findet und ersetzt, also mit welcher Funktion. Damit Dateien zu ändern hatte ich leider schon genug Probleme^^

                        Auch wenn eddis Methode viel schöner ist ist sie vielleicht nicht ganz so einfach nachzuvollziehen, deshalb mal ein anderer Ansatz:

                          
                        $pwFile = '/home/web518/passwords/.htpasswd_gal12'  
                        $zeilen = file($pwFile); // liest die komplette Passwortdatei in ein Array  
                          
                        for($z = 0; $z <= count($zeilen); $z++) { // wir machen einen Schleifendurchgang, für jede einzelne Zeile der Datei  
                          
                          list($username, $password) = explode($zeilen[$z], ':'); // hier zerteilen wir die einzelne Zeile an der Stelle  
                                                                                  // wo der Doppelpunkt  
                                                                                  // ist und speichern sie in zwei Variablen  
                          
                          if($_ENV['REMOTE_USER'] == $username) { // wenn die Zeile mit dem gerade angemeldeten User übereinstimmt  
                          
                            $zeilen[$z] = $username.':'.$neuesPasswort; // hierwird die Zeile im Array einfach komplett ausgetauscht  
                          
                            break; // da der Username nur einmal vorkommen darf brechen wir die schleife nach dem ändern ab  
                          {  
                        }  
                          
                        file_puts_content($pwFile, $zeilen); // Datei mit der neuen überschreiben  
                          
                        // oder falls man kein PHP5 zur Verfügung hat:  
                        # $handle = fopen($pwFile, "w");  
                        # fwrite($handle, join($zeilen))  
                        # fclose($handle);
                        

                        Alles ohne Gewähr und ungetestet, sollte aber theoretisch ungefähr so funktionieren.

                        Grüße
                        Jeena Paradies

                  2. Re:

                    Der User soll sein eigenes Passwort ändern können. Dieses steht in der .htpasswd in der Form username:passwort und muss dort geändert werden, damit das alte Passwort nicht mehr geht, sondern das neue. Dass heißt die Zeile mit dem Benutzernamen und Passwort muss gegen eine andere ausgetauscht werden. Um das mit PHP zu machen muss die Zeile doch bekannt sein oder??

                    Ganz richtig erkannt :)

                    Wie Du bereits korrekt bemerkt hast, ist die Form einer .htpasswd-Zeile "username:passwort". Also vergleichst Du in jeder Zeile nur den Usernamen mit $_ENV['REMOTE_USER']:

                    $f='.htpasswd';  
                    $c=0;  
                    $dat=[link:http://de3.php.net/manual/de/function.fopen.php@title=fopen]($f,'r+');  
                    [link:http://de3.php.net/manual/de/control-structures.while.php@title=while](![link:http://de3.php.net/manual/de/function.feof.php@title=feof]($dat)){  
                            $l=[link:http://de3.php.net/manual/de/function.strlen.php@title=strlen]($t=[link:http://de3.php.net/manual/de/function.fgets.php@title=fgets]($dat));  
                            [link:http://de3.php.net/manual/de/language.control-structures.php#control-structures.if@title=if]([link:http://de3.php.net/manual/de/function.strpos.php@title=strpos]($t,$_ENV['REMOTE_USER'])===0){  
                                    [link:http://de3.php.net/manual/de/function.fseek.php@title=fseek]($dat,$c,SEEK_SET);  
                                    [link:http://de3.php.net/manual/de/function.fwrite.php@title=fwrite]($dat,$_ENV['REMOTE_USER'].':'.$neuesPasswort."\n");  
                                    [link:http://de3.php.net/manual/de/control-structures.break.php@title=brea]k;  
                            }  
                            $c+=$l;  
                    }  
                    [link:http://de3.php.net/manual/de/function.fclose.php@title=fclose]($dat);
                    

                    Dabei macht sie dieses kleine Scriptbeispiel zunutze, daß die der Hash des Passworts immer gleichlang ist.

                    Gruß aus Berlin!
                    eddi

  2. Hi Forum,

    Hi Forums-Besucher,

    ich möchte eine private Bildergalerie erstellen und habe die soweit fertig geschrieben, jetzt fehlt mir noch ein Passwortschutz.

    Ich möchte diesen über Session-IDs realisieren. Da ich aber eine sehr durchschaubare Ordnerstruktur habe, sollen die Bilder zusätzlich geschützt werden, damit wer die Adresse kennt sie nicht einfach direkt eintippen und die Bilder anschauen kann.
    Welche Methode ist hier die beste?

    ich würde die Bilder in einem per HTTP nicht erreichbaren Verzeichnis lagern (außerhalb des Document-Roots oder per deny from all in .htaccess gesichert (Apache)) und mir ein PHP-Skript schreiben, dass per readfile() das Bild aus dem geschützen Verzeichnis liest und an den Browser sendet. Dann kannst du in dieses PHP-Skript Programmcode schreiben, der überprüft, ob der User das gewünschte Bild überhaupt lesen darf und wenn nicht per die() abbrechen. Bzgl. deiner User-Verwaltung kannst du auf Basis einer Datenbank (wenn >= PHP5.1 PDO, sonst halt std. MySQL oder so) oder einer Textdatei deine Userdaten speichern und dir ein Login-Formular basteln, das prüft ob die eingegebenen Daten mit denen in der DB übereinstimmen und in einer Session speichert, dass der User das Recht hat, die Bilder abzurufen..

    Schöne Grüße
    Julian

    1. Hallo,

      ich würde die Bilder in einem per HTTP nicht erreichbaren Verzeichnis lagern (außerhalb des Document-Roots oder per deny from all in .htaccess gesichert (Apache)) und mir ein PHP-Skript schreiben, dass per readfile() das Bild aus dem geschützen Verzeichnis liest und an den Browser sendet.

      das würde ich nicht tun. Es ist ein hier immer wieder als gängige Methode beschriebenes Vorgehen, daher will ich hier ein Veto formulieren:

      PHP wird meist über CGI _gestartet_ - und das für jeden Request an eine Resource, während der Webserver allermeist dafür bereits Prozesse vorgeforkt/Threads vorhält. Der Request wird via PHP also (zwar unmerklich aber) erheblich länger für seine Abarbeitung benötigen. Zudem kommt auch noch, daß Webserver eingehende Verbingung eine Zeit lang offen halten (keep alive). PHP ist auch nicht gerade klein im Arbeitsspeicher und wird für die Zeit, die die Verbungung offen ist, ebenso "am Leben" gehalten.
       Es ist allso in mehreren Hinsichten besser HTTP-Auth zu verwenden.

      Gruß aus Berlin!
      eddi

      1. Hi eddi,

        PHP wird meist über CGI _gestartet_

        ist das tatsächlich so?
        Ich sehe eigentlich PHP als Apache-Modul als den Normalfall an, CGI nur als Notlösung.
        Es ist zwar tatsächlich so, dass mein Hoster auch PHP als CGI realisiert hat, aber das muss ja nicht repräsentativ sein.

        So long,
         Martin

        --
        Fettflecke werden wieder wie neu, wenn man sie regelmäßig mit etwas Butter einschmiert.
        1. Hallo,

          PHP wird meist über CGI _gestartet_

          ist das tatsächlich so?

          jupps.

          Es ist zwar tatsächlich so, dass mein Hoster auch PHP als CGI realisiert hat, aber das muss ja nicht repräsentativ sein.

          Die Schlüsselworte nennst Du bereits selbst: CGI <-> Hoster. Mittels CGI und dem üblichen Apachen läßt sich eine sichere Userverwaltung von Tausenden Webs auf einer Maschine realisieren, die durch die Funktionalität von suexec sichergestellt wird. Denn wie Dir vielleicht bekannt ist, wird PHP als Servermodul immer unter dem (Singular) System-User des Webservers ausgeführt, was ein Sicherheitsrisiko darstellt.
           Man kann anmerken, daß es noch mod_suphp gibt. Dieses jedoch verlangt, das der Apache zwingend mit root-Rechten arbeiten muß. (Ich persönlich würde einen Netzwerkdienst _nie_ mit root-Rechten seine Arbeit verrichten lassen. Anscheinend sehen die meisten Provider dies ebenso.)

          Gruß aus Berlin!
          eddi