Verzeichnisschutz

  • Hey,


    ich bin gerade dabei einen Verzeichnisschutz für ein Verzeichnis meines Webservers mit htaccess & htpasswd einzurichten.


    Meine htaccess sieht so aus:

    Code
    1. AuthType Basic
    2. AuthName "Zugriff verweigert - Bitte erst einloggen!"
    3. AuthUserFile /home/webpages/lima-city/stef/stef.lima-city.de/application/.htpasswd
    4. Require user Stef

    und meine .htpasswd so:

    Code
    1. Stef:$argon2i$v=19$m=65536,t=4,p=1$b3p2RWFSTmFFUGlxeFFFeg$ZhfM5a8AVL921TE43PpAOg1kfpfRYyOXh85kxjk5Vxk


    Die .htaccess habe ich in das Hauptverzeichnis gelegt. Dort wo auch die index.php liegt. Die .htpasswd in den application Order weil in diesem die Ordner drinliegen auf die ich den Zugriff einschränken möchte.

    Nun habe ich gelesen, dass ich die .htpasswd in jedes Verzeichnis hinzufügen soll, dass geschützt werden soll. Nun ist es so, dass entweder ein 505 Internal Server Error entsteht - oder die Aufforderung bereits beim Laden der index.php erfolgt - oder wenn ich mich authentifiziere wird die Seite ohne CSS & Co geladen welches im application Ordner ist oder nach dem authentifizieren entsteht ein 505 Internal Server Error.

    Ich habe jetzt einiges durchschaut und mehrere Tutorials mir angeschaut und in Foren gesucht konnte jedoch dies nicht bei mir anwenden damit es funktioniert.

    Mein Ziel ist es, dass alle Dateien die benötigt werden noch geladen werden aber der Zugriff auf diese über den Browser nur durch Authentifizierung möglich ist.


    Wie kann ich dies schaffen?


    Grüße,

    Stef

  • Hey zusammen,


    ich wollte eben testweise mein Formular auf der Index.php absenden. Nach dem Klick auf den Button wird das Anmeldefenster vom Verzeichnisschutz angezeigt...


    Ich kann mir vorstellen, dass es daran liegt, weil die PHP-Datei, die dort durch JS aufgerufen wird im application-Ordner liegt der geschützt werden soll. Ich habe gelesen, dass ich mittels .htaccess auch nur einzelne Ordner schützen kann. Dadurch hat der Besucher die Möglichkeit wieder über den Browser auf mein Dateisystem zuzugreifen. Dies ist also keine Wahl.


    Wie kann ich es nun erreichen, dass trotz Verzeichnisschutz des ganzen application Verzeichnisses mit Unterordner das Formular abgesendet werden kann?


    So sieht dort meine Ordnerstruktur aus:

    verzeichnis.PNG


    Grüße,

    Stef

  • Der Verzeichnisschutz der .htaccess verhält sich erstmal rekursiv.

    Theroetisch kannst Du mit einer .htaccess im Unterverzeichnis, das nicht geschützt werden braucht mit Satisfy Any den Schutz für das Verzeichnis aufheben. Ich meine, das verhält sich auch rekursiv, bin mir aber grad nicht sicher.


    Aber im Endeffekt, ist das nur mal so in den Raum geworfen, weil ich irgendwie noch nicht ganz verstanden habe, um welche Szenarien es Dir wirklich geht.

  • Hi Arne,


    in der index.php ist ein Kontaktformular. Beim Absenden wird eine JS-Function aufgerufen welche die Formulardaten via einem HTTPRequest an eine PHP Datei im Verzeichnis ./application/php liegt. Nun kann jeder auf mein application Folder über den Browser zugreifen.


    Genau dies möchte ich verhindern. Ich möchte dabei jedoch, dass ich Dateien aus diesen Ordnern in der index.php und auf weiteren Seiten aufrufen kann.


    Wenn ich dies mit dem Verzeichnisschutz von Apache mache muss ich mich zu erst einloggen um die Dateien aus dem Verzeichniss application verwenden zu können.

    Was mir noch optional einfällt ist den application Ordner außerhalb meines Root Ordners zu legen welcher im Broswer aufgerufen wird.

  • Einfach das PHP-Skript außerhalb des application-Ordners legen?

    Was soll das bringen? Er möchte das PHP-Script per XmlHttpRequest aufrufen, d.h., jeder der in der Lage ist in den Quelltext zu schauen, wird das Zielscript sehen und direkt aufrufen können, vollkommen egal, wo es liegt.


    Lege einfach eine leere index.html in den Ordner, dann kann keiner mehr was sehen, es sei denn, er kennt den genauen Dateinamen.

    Genau den kennt man ja, wenn man in den Browserquelltext schaut ;)


    Stef : In so einem Fall arbeite ich mit Sessions, die sind auch aus einem XmlHttpRequest gültig. Einfach in die Session einen Token setzen und im PHP-Script verifizieren. So kannst Du auf einfache Weise feststellen, ob es ein gültiger Aufruf ist oder nicht.

  • Hey,


    vielen Dank für eure Antworten. :)


    Es sind echt coole Tipps dabei. Ich habe nun beim Aufruf des application Ordners eine index.php erstellt, welche auf die index.php im Root weiterleitet.


    Arne Drews : Okay. Erstellst du dann einfach eine Session mit einem automatisch generiertem Hash (Token), fügst diesen zu einem Hidden-Formularfeld als Value hinzu und fragst ihn dann vor der Weiterverarbeitung der Formulardaten im PHP Skript ab?

  • Nö, viel zu kompliziert.

    Ich öffne einfach eine Session und hinterlege einen Hashwert/Token, kann auch ein ordinärer bool sein, bspw.:

    PHP
    1. session_start();
    2. $_SESSION['is_valid_request'] = true;

    Wenn Du mit dem XmlHttpRequest auf die Server-Datei gehst, musst Du ja nur prüfen, ob die Session Variable vorhanden ist:

    PHP
    1. session_start();
    2. if ( !isset($_SESSION['is_valid_request']) || !$_SESSION['is_valid_request'] )
    3. exit;

    Bei einem Direktaufruf der Serverdatei ist diese Variable nicht vorhanden, da keine Session existiert. Dann springt er raus oder Du leitest auf Deine root-index um.

    Du kannst wenn Du willst auch noch den Token prüfen, wenn Du bspw. einen Hash verwendest, halte ich dafür aber nicht für notwendig.

  • Dir geht es doch darum, dass man die kontaktformular.php nicht direkt aufrufen kann, oder habe ich Dich falsch verstanden?

    Wenn ich es richtig verstanden habe, ist das ein Weg, der funktioniert.


    Die entsprechende Session-Variable muss ja auch nicht in der index.php direkt gesetzt werden, sondern erst, wenn das Formular aufgerufen wird.

    Und wenn Du dann in der kontaktformular.php nach Verarbeitung der Daten die Session-Variable wieder entfernst, ist doch alles gut.


    Wo ist denn genau das Verständnisproblem?


    Beispiel:

    Da es ziemlich viele Möglichkeiten gibt, wie so eine Website aufgebaut sein kann, versuche das mal nur schematisch darzustellen.

    PHP: index.php
    1. session_start();
    2. /*
    3. ... some actions
    4. */
    5. // $requestedContent : called uri, here 'mein-formular' e.g.
    6. $_SESSION['is_valid_form_request'] = ( $requestedContent == 'mein-formular' );

    Damit ist die Variable in diesem Falle zwar auf allen Seiten gesetzt, aber nur auf der Formular-Seite true!

    Für Deine Struktur musst Du die Bedingung natürlich entsprechend anpassen.


    Aber die Abfrage in der kontaktformular.php sieht nun relativ simpel aus:

  • Hey,


    vielen Dank für die Erklärung.


    Jetzt verstehe ich dies was du meinst.


    Ich könnte auch überprüfen ob über den Request Daten vorhanden sind - wenn nein wurde die Datei so aufgerufen und ich kann die Person wieder auf die index.php umleiten?


    Danke dir :)

  • Ich könnte auch überprüfen ob über den Request Daten vorhanden sind - wenn nein wurde die Datei so aufgerufen und ich kann die Person wieder auf die index.php umleiten?

    Halte ich für keine gute Idee. Daten sendest Du per POST oder GET, beide Fälle kann ich simulieren.

    Mache ich laufend, wenn ich mir meine Logins automatisiere. Ich speichere keine Daten/Passwörter im Browser, sondern rufe das Formularziel mit den entsprechenden Parametern direkt auf. Die meisten lassen das zu, aber das ist eigentlich genau der Punkt, den Du nicht willst.


    Eine Session-Variable ist aus meiner Sicht die sinnvollste Variante.