Come proteggere una directory in Apache usando una sessione PHP


8

Ho un sito che utilizza la sessione PHP per l'autenticazione. Esiste una directory a cui vorrei limitare l'accesso che non utilizza alcun PHP, è solo piena di contenuto statico.

Semplicemente non so come limitare l'accesso senza che ogni richiesta passi attraverso uno script PHP. Esiste un modo per fare in modo che Apache controlli le credenziali della sessione e limiti l'accesso come Basic Auth?

Risposte:


5

A meno che tu non abbia modificato le impostazioni, i dati della sessione PHP sono memorizzati in una variante nel suo formato serialize () in una directory temporanea, e non è facile ottenerlo senza usare PHP stesso.

sfortunatamente, sembra che tu voglia la velocità dei file serviti statici mentre autorizzi dinamicamente ogni richiesta, che non sono obiettivi realmente compatibili. Potresti comprendere avendo uno script PHP super leggero a cui poi usi mod_rewrite per riscrivere le richieste ai file al suo interno, il che passa attraverso le cose che vanno bene. Esempio semplicissimo:

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

in particolare, quello script PHP è in esecuzione per sempre, quindi dovresti riavviare apache se lo cambi, credo.

Tutto questo non è testato, ma è più o meno la direzione in cui penso che dovresti andare.

Riferimenti:


Mi piace questo approccio, ma mi chiedo se uno script RewriteMap abbia accesso a qualcosa di diverso da stdin? Ha il contesto dei cookie ecc?
Cogsy,

In realtà, sì, hai ragione. Puoi inviare il valore dei cookie usando la sintassi delle variabili di ambiente di mod_rewrite (Quindi penso che la sintassi diventerebbe qualcosa come $ {auth: $ 1 $ COOKIES} e dovresti dividere la linea di stdin per argomenti, con questo metodo potresti raccogli i contenuti della sessione
Aquarion il

Cosa succede se si imposta un cookie accedendo con un id di autenticazione costante (molto bit) e lo si controlla tramite l'accesso alla directory? Non è la soluzione migliore, ma può funzionare su pagine di amministrazione ... (Per pagine di condivisione file non funziona perché gli utenti possono condividere il cookie ...)
inf3rno

1

Se avevi un particolare cookie che puoi aspettarti, puoi testare la sua assenza con mod_rewrite e dare un 403 Proibito.

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

Ma, se qualcuno sapesse di aver bisogno di un set di cookie con "LoggedIn = true", potrebbe facilmente aggirare la "protezione".

Una sessione PHP è specifica di PHP. Apache non ha modo di utilizzare alcuna informazione in una sessione PHP. Dovresti avere un modulo di autenticazione specifico per fare la verifica della sessione.

Quello che ho visto fare alla maggior parte delle persone è che uno script PHP gestisca la pubblicazione del contenuto statico in quanto ottiene la richiesta, verifica la sessione, legge il file e invia il contenuto con le informazioni MIME appropriate.


Oppure puoi modificare il file .htaccess con ogni login, logout e gc ...
inf3rno

1

La soluzione convenzionale per quel problema è di reindirizzare ogni chiamata su quella cartella su un file php, che controlla i permessi dell'utente e dopo che legge il file e lo invia al flusso di output o reindirizza l'utente al "nessun permesso" luogo. Per esempio...

Un altro modo complicato per proteggere i tuoi file è generare un token da session_id e un salt statico (e optianally dal percorso del file statico) e controllarlo accedendo al file. Quindi devi rigenerare quel token nel tuo file htaccess. Non so se sia possibile solo con .htaccess, o devi usare php per questo. Ho trovato una soluzione simile qui. Sono convinto al 99% che md5 non sia una funzione di riscrittura mod integrata.


1
Adoro l'idea del link Blogspot da utilizzare RewriteMapper una prg://…risorsa di script shell che esegue tutta la crittografia e la verifica MD5 effettive. Ho bisogno di testarlo e assicurarmi che funzioni sul mio setup, ma sembra che dovrebbe funzionare con Vanilla Apache + il modulo mod_rewrite.
terzo

1

Il mio piano per risolvere questo problema è adesso

  1. Reindirizzare la richiesta a PHP

    RewriteEngine on
    RewriteRule ([0-9a-z-_]+)$ authenticateUser.php?&file=$1 [L]
    
  2. Autentica l'utente in PHP (tutti gli altri metodi di autenticazione sono forse troppo deboli o richiedono la scrittura continua in file)

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.