Comment sécuriser un répertoire dans Apache à l'aide d'une session PHP

8

J'ai un site qui utilise une session PHP pour l'authentification. Il y a un répertoire auquel je voudrais restreindre l'accès qui n'utilise aucun PHP, il est juste plein de contenu statique.

Je ne sais tout simplement pas comment restreindre l'accès sans que chaque demande passe par un script PHP. Existe-t-il un moyen pour qu'Apache vérifie les informations d'identification de la session et restreigne l'accès comme Basic Auth?

Cogsy
la source

Réponses:

5

À moins que vous n'ayez modifié les paramètres, les données de session PHP sont stockées dans une variante de son propre format serialize () dans un répertoire temporaire, et il n'est pas facile d'y parvenir sans utiliser PHP lui-même.

malheureusement, vous semblez vouloir la vitesse des fichiers servis statiques tout en autorisant dynamiquement chaque requête, qui ne sont pas des objectifs vraiment compatibles. Vous pourriez compromettre en ayant un script PHP super léger que vous utilisez ensuite mod_rewrite pour réécrire les requêtes vers les fichiers qu'il contient, ce qui passe bien. Exemple super simple:

.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";
        }
 }

notamment, ce script PHP fonctionne pour toujours, vous devrez donc redémarrer apache si vous le changez, je pense.

Tout cela n'a pas été testé, mais c'est à peu près la direction dans laquelle je pense que vous devriez aller.

Références:

Aquarion
la source
J'aime cette approche, mais je me demande si un script RewriteMap a accès à autre chose que stdin? At-il le contexte des cookies, etc.?
Cogsy
En fait, oui, vous avez raison. Vous pouvez envoyer la valeur des cookies en utilisant la syntaxe des variables d'environnement de mod_rewrite (donc je pense que la syntaxe deviendrait quelque chose comme $ {auth: $ 1 $ COOKIES} et vous auriez à diviser la ligne de stdin par des arguments, par cette méthode, vous pourriez récupérer le contenu de la session
Aquarion
Que faire si vous définissez un cookie en vous connectant avec un identifiant d'authentification constant (beaucoup de longueur en bits) et que vous le vérifiez par un accès au répertoire? Ce n'est pas la meilleure solution, mais cela peut fonctionner sur les pages d'administration ... (Par les pages de partage de fichiers, cela ne fonctionne pas parce que les utilisateurs peuvent partager le cookie ...)
inf3rno
1

Si vous aviez un cookie particulier auquel vous pouvez vous attendre, vous pouvez tester son absence avec mod_rewrite et donner un 403 Forbidden.

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

Mais, si quelqu'un savait qu'il avait besoin d'un cookie avec "LoggedIn = true", alors il pourrait facilement contourner votre "protection".

Une session PHP est spécifique à PHP. Apache n'a aucun moyen d'utiliser des informations dans une session PHP. Vous devriez avoir un module d'authentification spécifiquement pour faire la vérification de session.

Ce que j'ai vu la plupart des gens, c'est qu'un script PHP gère le service du contenu statique dans la mesure où il obtient la demande, vérifie la session, lit le fichier et envoie le contenu avec les informations MIME appropriées.

Rugmonster
la source
Ou vous pouvez modifier le fichier .htaccess par chaque connexion, déconnexion et gc ...
inf3rno
1

La solution conventionnelle à ce problème consiste à rediriger chaque appel de ce dossier vers un fichier php, qui vérifie les autorisations de l'utilisateur, puis lit le fichier et l'envoie au flux de sortie ou redirige l'utilisateur vers la «absence d'autorisation». site. Par exemple...

Une autre façon délicate de vous protéger est de générer un jeton à partir de session_id et un sel statique (et optiquement à partir du chemin de fichier statique), et de le vérifier par l'accès au fichier. Vous devez donc régénérer ce jeton dans votre fichier htaccess. Je ne sais pas si c'est possible uniquement avec .htaccess, ou vous devez utiliser php pour cela. J'ai trouvé une solution similaire ici. Je suis convaincu à 99% que le md5 n'est pas une fonction de réécriture de mod intégrée.

inf3rno
la source
1
J'adore l'idée du lien Blogspot à utiliser RewriteMappour une prg://…ressource de script shell qui effectue tout le cryptage et la vérification MD5 réels. Je dois tester cela et m'assurer qu'il fonctionne sur ma configuration, mais il semble que cela devrait fonctionner avec vanilla Apache + le module mod_rewrite.
Thirdender
1

Mon plan pour résoudre ce problème est maintenant de

  1. Rediriger la demande vers PHP

    RewriteEngine on
    RewriteRule ([0-9a-z-_]+)$ authenticateUser.php?&file=$1 [L]
    
  2. Authentifiez l'utilisateur en PHP (toutes les autres méthodes d'authentification sont peut-être trop faibles ou nécessitent d'écrire dans des fichiers tout le temps)

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

Rainer Rillke
la source