Proteggere file caricati dall'esterno ma renderli accessibili per gli utenti loggati.

  • Creatore Discussione Creatore Discussione otto9due
  • Data di inizio Data di inizio

otto9due

Utente Attivo
22 Feb 2014
591
25
28
In pratica ho quest esigenza. in un'area riservata, protetta da login do la possibilità di caricare dei file su una directory ( server condiviso ).
Ora non vorrei che i file fossero accessibili da link per tutti. Ma solo per gli utenti loggati, e cmq non dall'esterno.
Ho trovato alcune soluzioni online tra cui questa:
IMpostare per la cartella questo .htaccess

Codice:
<Files ~ ".+">
Order allow,deny
Deny from all
Satisfy All
</Files>

e poi usare una cosa del genere per recuperare il file e restituirlo al client:

PHP:
// file download
header("Content-Type: application; name=".$nome_file);
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$size_file);
header("Content-Disposition: inline; filename=".$nome_file);
header("Expires: 0");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: private");
header("Pragma: public");
 
readfile($percorso_assoluto.'/assets/doc/'.$cartella.'/'.$nome_file);

Per il momento sto usando xampp in locale e se provo a fare questa cosa mi restituisce un errore 403, forbidden.
Può essere che per percorso assoluto si intenda il percorso delle cartelle del server e non quello web?
Quale soluzione posso adottare per ottenere il risultato sperato?
Grazie in anticipo.
 
Forse ho trovato una soluzione, la posto tante volte può servire ad altri.
PHP:
//$percorso_assoluto = $_GET['path'];
$percorso_assoluto = $_SERVER['DOCUMENT_ROOT'];
$cartella = strtolower($_GET['dir']);
$nome_file = $_GET['file'];
$file_complte =  $percorso_assoluto.'/assets/doc/'.$cartella.'/'.$nome_file;

// file download
if (file_exists($file_complte)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename="'.basename($file_complte).'"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file_complte));
    readfile($file_complte);
    exit;
}else{
    echo 'Nessun file Trovato';
}

Qui ci faccio arrivare i dati in get e mi fa scaricare il file contenuto in una cartella forbidden.
Credete possa funzionare anche su un server reale LAMP?
 
Perché non crei una variabile di sessione al login e poi verifichi all'inizio dello script della pagina del file se quella variabile è settata?
Mi spiego meglio:
Pagina di login
PHP:
session_start()

//Login avvenuto
$SESSION["auth"] = 1
//Redirect alla pagina con i file

Pagina file
PHP:
session_start()

if ($SESSION["auth"] == 1) {
  //Fai un Echo dell'html della pagina con i file
} else {
  //Mostri errore
}

Non fare caso alla sintassi del codice potrebbe essere errata (sono abituato agli aiuti del software )
 

Discussioni simili