2012-06-12 14 views
10

Desidero nascondere la posizione della cartella di download in modo che quando l'utente scarica un file non possa vedere la posizione. Penso che questo possa essere fatto usando un file .htaccess ma come posso fare questo? In alternativa, come può essere fatto con PHP?come nascondere la posizione attuale della cartella di download

+0

No, non è possibile. Questa è una cosa fondamentale per consentire all'utente di fare ciò che vuole con il file che sta scaricando. – yent

+0

Penso che intenda come nascondere l'URL dello script di download – michael

+0

@yent in realtà voglio solo nascondere la posizione dell'utente in cui esiste il file –

risposta

24

Questo è come lo faccio in PHP:

<?php 
$fakeFileName= "fakeFileName.zip"; 
$realFileName = "realFileName.zip"; 

$file = "downloadFolder/".$realFileName; 
$fp = fopen($file, 'rb'); 

header("Content-Type: application/octet-stream"); 
header("Content-Disposition: attachment; filename=$fakeFileName"); 
header("Content-Length: " . filesize($file)); 
fpassthru($fp); 
?> 

Inoltre, se non si vuole a chiunque di avere accesso al percorso del file, inserire un file denominato .htaccess nella vostra cartella di download con solo i contenuti :

deny from all 

Ho modificato leggermente il codice. Innanzitutto quando dico falso nome di file e nome di file reale, il nome file falso è il nome che il downloader scaricherà il file come, dove il nome file reale è il nome del file effettivo nella cartella di download sul server.

Inoltre, controllo per verificare che l'utente abbia effettuato l'accesso e sia in grado di scaricare il file. Se sceglie di scaricare il file, un file PHP viene chiamato in una nuova scheda (con il codice per il download dall'alto), poi alla fine del file che ho la riga:

exit; 

Così, quando si fa clic su il link per il download, una pagina vuota si apre in una nuova scheda rapidamente, quindi esce rapidamente e inizia il download.

EDIT: Il link per il download simile a questa:

<a href="simpleDown.php?id=<?php echo $_GET['id']; ?>" target="_blank">Download!</a> 

Dove id è la id del download nel database, e in script scaricare dall'alto trovo la voce con quella id, quindi ottenere il suo vero nome del file e il nome del file falso. Puoi farlo senza il database però.

+1

'.htaccess' ** not **' .htacess' (almeno con le impostazioni predefinite) – Lix

+0

oh mio male, haha, corretto – iedoc

+0

@iedoc ma, come faccio a cambiare il dominio di download dell'URL. – Kumar

4

Forse dovresti esaminare Mod Rewrite o utilizzare lo script PHP per poter accedere al file semplicemente andando a file.php?f=someHash e quindi utilizzando un flusso ottetto per costringere l'utente a scaricare il file.

+2

+1: questa sarebbe la soluzione ideale. Passare tutti i download attraverso uno script PHP non significa solo spostare la directory dei dati dalla radice pubblica, ma è possibile anche sovrapporre i controlli di sicurezza. Idealmente non fare riferimento ai file per nome file, utilizzare un ID che si associa al file in modo che il nome possa essere modificato a piacimento senza rompere i collegamenti esistenti. – michael

2

Quello che vorrete fare è indirizzare l'utente a fake_url.php e quindi riscrivere quell'URL in un altro file - real_url.php. Ciò rende efficacemente lo real_url.php come nascosto poiché l'utente non è a conoscenza del reindirizzamento che si verifica nel file .htaccess.

RewriteRule fake_url.php(.*)$ real_url.php?$1 [L,QSA] 

Nella tua real_url.php, è possibile leggere i parametri passati attraverso il reindirizzamento e quindi usare qualcosa di simile a readFile() per inviare il file appropriato indietro per l'utente dall'interno real_url.php

Così l'utente vedrà solo la URL -
https://my-secret-site/download.php?file=file_to_download

E nel tuo real_url.php saprete quale file è stato richiesto ispezionando il parametro $_GET['file'].

L'effettiva posizione dei file che l'utente sta scaricando non ha più importanza. Tutti i download vanno da fake_url.php e solo lo script deve conoscere la posizione reale della cartella dei download.

-1

Penso che la parte principale sia "scrivere su .htaccess", che può essere fatto semplicemente con il comando fwrite, ma questa soluzione non funzionerà se si sta dando all'utente, una scelta di lettura online del pdf perché in questo caso socket ha la necessità di aprire per più tempo (in qualche modo, se si esegue questa operazione, allora questo può compromettere la sicurezza!),

<?php 
session_start(); 
$fileLocation = getenv("DOCUMENT_ROOT") . "your_download _folder/.htaccess"; 
$file = fopen($fileLocation,"w"); 
$k="\.(md|htaccess)$"; 
$content = "IndexIgnore * 
Order Deny,Allow 
Deny from All 

AddType application/octet-stream .pdf"; 
fwrite($file,$content); 
fclose($file); 
$p=getenv("DOCUMENT_ROOT") . "your_download _folder/".$_SESSION['x'](file_to_be_downloaded !); 
header("Content-type:application/pdf"); 
header("Content-Disposition:attachment;filename=".$_SESSION['x']); 
readfile($p); 
$fileLocation = getenv("DOCUMENT_ROOT") . "your_download _folder/.htaccess"; 
$file = fopen($fileLocation,"w"); 
$k="\.(md|htaccess)$"; 
$content = "IndexIgnore * 
Order Allow,Deny 
Deny from All 

AddType application/octet-stream .pdf"; 
fwrite($file,$content); 
fclose($file); 
exit; 
?> 

Risultato: nella finestra successiva (che verrà chiuso nel momento successivo), un l'opzione di download del file verrà attivata dall'utente.

Problemi correlati