2009-04-10 10 views
6

Ho ereditato un'applicazione con un buco di sicurezza abbagliante.Limita l'accesso ai file agli utenti php autorizzati

Ha una sicurezza basata sulla sessione, ma i caricamenti di file (che sono specifici dell'utente) non sono protetti in alcun modo e sono memorizzati nella struttura dei file pubblici.

I nomi di file non seguono alcuna convenzione in quanto tale, rendendoli difficili da indovinare, ma i dati sono sensibili e pertanto è necessario implementare una misura di sicurezza per impedire l'accesso non autorizzato ai file.

Spostare la posizione dei file non è davvero un'opzione, quindi sto esaminando una soluzione htaccess per inoltrare richieste a uno script di gestore php.

Qualcuno ha esperienza nell'implementazione di questo tipo di cose o di buone soluzioni alternative? Esempi specifici di sintassi .htaccess sono molto apprezzati, dato che sto lottando in questo settore.

risposta

6

Non capisco davvero perché spostarli non è un'opzione, dal momento che spingere le richieste per loro a un gestore significa che non importa più dove sono memorizzati. Ma tu sei l'uomo sulla scena.

.htaccess assomiglia:

RewriteEngine on 
RewriteRule path/to/where/these/files/live/(.*) /handlerscript.php/$1 

Poi si solleva il percorso del file rimanente e nome da $_SERVER['PATH_INFO'].

+0

Hai dimenticato mod_rewrite .. questa è una soluzione migliore. – Matt

+0

Grazie, darò un'occhiata a questa soluzione - il motivo per cui non vogliamo spostare la posizione dei file è che gli utenti ricevono e-mail con collegamenti ai loro file (di nuovo, non io mi affretto ad aggiungere!). Immagino che potrebbe ancora essere fatto, ma richiederebbe un po 'più di lavoro per gestire il reindirizzamento? – BrynJ

+0

Dovrei aver aggiunto a quanto sopra che farò rimbalzare l'utente a un prompt di login in futuro (tramite il gestore) se non sono loggati. – BrynJ

0

Penso che potrebbe essere necessario scrivere uno script che servirà le immagini, quindi utilizzare htaccess per limitare completamente l'accesso alle immagini reali da un browser.

Lo script può prendere il percorso web dell'immagine, decidere se l'utente ha accesso, quindi utilizzare qualcosa come fpassthru per alimentare un'immagine reale al browser.

Tutti i riferimenti alle immagini devono essere modificati, tuttavia, per fare riferimento allo script di servizio.

Così, invece di accedere alle immagini con /images/123/5423453245.jpg, sarebbe /image.php?images/123/5423453245.jpg

O qualcosa di simile a quello.

+0

Vedo quello che stai dicendo, ma questo è davvero quello che ho bisogno di evitare di fare (cambiare i collegamenti). Non sono immagini tra l'altro :-) – BrynJ

3

Beh, si potrebbe fare apache parse .jpg il file di una certa cartella aggiungendo quanto segue al file .htaccess

AddHandler php5-cgi .jpg 

allora si potrebbe impostare un file di php per analizzare la richiesta il modo in cui il caos che si era raccomandarlo e facendo una certa convalida, poi basta tornare intestazioni jpeg insieme con l'immagine corretta u'd desidera visualizzare

ecco un esempio

<?php 
if($validUser) 
    { 
    header("Cache-control: No-cache"); 
    header("Pragma: No-cache"); 
    header("Content-Type: image/jpeg"); 
    //correct picture address 
    $img = imagecreatefromjpeg("2326_b_lil.jpg"); 
    imagejpeg($img); 
    } 
    else 
    { 
    //code for error image 
    } 
?> 

pl facilità fammi sapere se vuoi un esempio più ampio

+0

I file non sono generalmente immagini, ma potrebbero esserlo. Tuttavia, il tuo esempio mi ha fatto pensare: non sarebbe meglio usare solo readfile piuttosto che ricreare l'immagine (il tuo codice viene convertito in un vero file di colore non compresso, quindi in un file jpeg)? – BrynJ

+0

Im semplicemente usando quella funzione per caricare facilmente i dati del file e inviarli al browser, è possibile sostituire questa procedura con una semplice fopen ed echo l'input, dal momento che hai già inviato le intestazioni jpeg il browser la interp come un'immagine – perrohunter

Problemi correlati