So sichern Sie ein Verzeichnis in Apache mithilfe einer PHP-Sitzung


8

Ich habe eine Site, die PHP-Sitzung zur Authentifizierung verwendet. Es gibt ein Verzeichnis, auf das ich den Zugriff beschränken möchte, das kein PHP verwendet, sondern nur voller statischer Inhalte ist.

Ich weiß nur nicht, wie ich den Zugriff einschränken soll, ohne dass jede Anfrage ein PHP-Skript durchläuft. Gibt es eine Möglichkeit, Apache die Sitzungsanmeldeinformationen überprüfen zu lassen und den Zugriff wie bei Basic Auth einzuschränken?

Antworten:


5

Sofern Sie die Einstellungen nicht geändert haben, werden PHP-Sitzungsdaten in einer Variation ihres eigenen serialize () -Formats in einem temporären Verzeichnis gespeichert, und es ist nicht einfach, dies ohne Verwendung von PHP selbst zu erreichen.

Leider möchten Sie anscheinend die Geschwindigkeit statisch bereitgestellter Dateien, während Sie jede Anforderung dynamisch autorisieren, die nicht wirklich kompatible Ziele sind. Sie könnten kompromittieren, indem Sie ein superleichtes PHP-Skript haben, das Sie dann mit mod_rewrite umschreiben, um Anforderungen an Dateien darin umzuschreiben, was durch Dinge geht, die in Ordnung sind. Super einfaches Beispiel:

.htaccess:

 RewriteEngine On
 RewriteMap auth prg:auth.php
 RewriteRule (.*) ${auth:$1}

auth.php:

#!/usr/bin/php
 <?PHP
 set_time_limit(0); # This program needs to run forever. 
 $stdin = fopen("php://stdin","r"); # Keeps reading from standard in
 while (true) {
        $line = trim(fgets($stdin));
        if (isset($_SESSION['USER_LOGGED_IN'])) {
                echo $line\n";
        } else {
                echo "authfailed.html\n";
        }
 }

Insbesondere läuft dieses PHP-Skript für immer, sodass Sie Apache neu starten müssen, wenn Sie es ändern, denke ich.

Das ist alles ungetestet, aber das ist ungefähr die Richtung, in die du gehen müsstest.

Verweise:


Ich mag diesen Ansatz, aber ich frage mich, ob ein RewriteMap-Skript Zugriff auf etwas anderes als stdin hat. Hat es den Kontext von Cookies usw.?
Cogsy

Eigentlich ja, Sie haben einen Punkt. Sie können den Wert von Cookies mithilfe der Syntax der Umgebungsvariablen von mod_rewrite senden (ich denke, die Syntax würde so etwas wie $ {auth: $ 1 $ COOKIES} werden, und Sie müssten die Zeile von stdin nach Argumenten aufteilen, mit dieser Methode könnten Sie
Aquarion

Was ist, wenn Sie ein Cookie durch Anmelden mit einer konstanten Authentifizierungs-ID (viel Bitlänge) setzen und es durch Verzeichniszugriff überprüfen? Nicht die beste Lösung, aber es kann auf Administrationsseiten funktionieren ... (Bei Dateifreigabeseiten funktioniert es nicht, weil Benutzer das Cookie
freigeben

1

Wenn Sie ein bestimmtes Cookie hatten, das Sie erwarten können, können Sie es mit mod_rewrite auf seine Abwesenheit testen und ein 403 Forbidden geben.

RewriteCond %{HTTP_COOKIE} !LoggedIn=true
RewriteRule .* - [F,L]

Aber wenn jemand wüsste, dass er ein Cookie-Set mit "LoggedIn = true" benötigt, könnte er Ihren "Schutz" leicht umgehen.

Eine PHP-Sitzung ist spezifisch für PHP. Apache hat keine Möglichkeit, Informationen in einer PHP-Sitzung zu verwenden. Sie müssten ein Authentifizierungsmodul speziell für die Sitzungsüberprüfung haben.

Ich habe gesehen, dass die meisten Leute ein PHP-Skript haben, das die Bereitstellung des statischen Inhalts übernimmt, indem es die Anforderung erhält, die Sitzung überprüft, die Datei einliest und den Inhalt mit den entsprechenden MIME-Informationen versendet.


Oder Sie können die .htaccess-Datei bei jedem Login, Logout und gc ändern ...
inf3rno

1

Die herkömmliche Lösung für dieses Problem besteht darin, jeden Aufruf dieses Ordners in eine PHP-Datei umzuleiten, die die Benutzerberechtigungen überprüft und anschließend die Datei liest und an den Ausgabestream sendet oder den Benutzer an "keine Berechtigung" weiterleitet. Seite? ˅. Zum Beispiel...

Eine andere schwierige Möglichkeit, Ihre Dateien zu schützen, besteht darin, ein Token aus der session_id und einem statischen Salt (und optisch aus dem statischen Dateipfad) zu generieren und es durch den Dateizugriff zu überprüfen. Sie müssen dieses Token also in Ihrer htaccess-Datei neu generieren. Ich weiß nicht, ob es nur mit .htaccess möglich ist oder ob Sie dafür PHP verwenden müssen. Ich habe hier eine ähnliche Lösung gefunden. Ich bin zu 99% davon überzeugt, dass der md5 keine eingebaute Mod-Rewrite-Funktion ist.


1
Ich mag die Idee vom Blogspot-Link, RewriteMapeine prg://…Shell-Skript-Ressource zu verwenden, die die gesamte MD5-Verschlüsselung und -Verifizierung übernimmt. Ich muss dies testen und sicherstellen, dass es in meinem Setup funktioniert, aber es sieht so aus, als ob es mit Vanilla Apache + dem mod_rewrite-Modul funktionieren sollte.
Thirdender

1

Mein Plan, dieses Problem zu lösen, ist jetzt zu

  1. Leiten Sie die Anfrage an PHP weiter

    RewriteEngine on
    RewriteRule ([0-9a-z-_]+)$ authenticateUser.php?&file=$1 [L]
    
  2. Authentifizieren Sie den Benutzer in PHP (alle anderen Authentifizierungsmethoden sind möglicherweise zu schwach oder erfordern das ständige Schreiben in Dateien).

    if ( User::hasPermission() && isSane( $filePath ) ) {
        // 
        header( 'X-Sendfile: ' . $filePath );
    }
    
  3. Verwenden Sie Apaches mod_xsendfile( docs , github )


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.