RISOLTO (PHP) Nascondere la url di un file da scaricare...

Stato
Discussione chiusa ad ulteriori risposte.

jNash

Utente Attivo
1,327
105
Buongiorno, in una directory condivisa a cui accedo solo io, ho creato una serie di sottocartelle denominate PIPPO, PLUTO, PAPERINO, etc...
Dentro ogni cartella ho dei file tipo pippo_boh1.pdf, pippo_boh2.pdf, etc...naturalmente il contenuto cambia in base a dove si trova il file, se in PIPPO, PLUTO, etc...il nome dei file inizia sempre col nome della cartella.
Questo mi serve per andare ad inserire dei dati nella tabella (MySql).
Attraverso script in php mostro a ciascun utente (PIPPO, PLUTO, etc...) i link per poter scaricare i file contenuti nella cartella....facile così per ogni utente andare a scaricare file anche degli altri....
Pensavo di "nascondere" la url (in basso a sinistra, sopra la barra delle applicazioni), ma non so se esiste una soluzione più "fine".
Due dritte? Grazie.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Come stai memorizzando i file? Voglio dire, a database hai qualche riferimento al file immagino. Dovresti avere nella tabella i nomi dei file: potresti rinominarli quando vengono caricati e fare l'md5 o un altro hash (SHA1 o 2); poi nella tabella mysql mantieni il nome del file originale e il nome "hashato".
Insomma, una tabella tipo:

Codice:
+-------+-----------+------------+-----------+
|   ID  | id_utente |  nome_file | nome_md5  |
+-------+-----------+------------+-----------+

In questo modo è altamente improbabile che possa "indovinare" un hash. Avendo anche il nome originale, quando e se mostri i file di ogni utente (tipo in una tabella) andrai a mostrare il nome_file a video, che punta al file (che ha come nome l'md5 o l'hash).

Per spiegarmi:

HTML:
<a href="0238f76sd7b7s8f6s6d765f8b7f7b6f6.pdf">pippo1.pdf</a>

Se li fai accedere direttamente alla risorsa ne perdi il controllo. Dovresti passare sempre da una tua pagina php che riceve la richiesta, anche se non hai una tabella come quella mostrata sopra (anzi, soprattutto in questo caso).

Se non hai la tabella a db, puoi fare una cosa di questo tipo:
Codice:
dominio.xxx/files/download?name=pippo

la chiamata che fai a "download" andrà a prendere "pippo.pdf" e a cercarlo nella directory dell'utente (se sei loggato come pippo, andrai in pippo, se sei loggato come pluto, andrai in pluto). Ovviamente trovata la directory sei punto e a capo.

La soluzione migliore rimane la tabella che ho mostrato sopra.
 
  • Mi piace
Reazioni: jNash e Mursey

jNash

Utente Attivo
1,327
105
Avevo pensato anche io a "modificare" il nome del file tramite hash md5...per avere un valore di hash per ogni file presente in cartella.
Però poi non posso modificare i nomi dei file nelle cartelle con questo hash, perché sfogliando le cartelle non avrei più riferimenti a quale file sia...Cioè il nome originale del file nella cartella deve restare.
Quindi posso eventualmente "aggiungere" un mezzo di md5() al nome file originale...o no?
E fare qualcosa come
HTML:
<a href="0238f76sd7b7s8f6s6d765f8b7f7b6f6_pippo_boh1.pdf">pippo_boh1.pdf</a>
L'utente PIPPO sa che esiste un link analogo, con PLUTO, ma non sa come ho generato l'hash...
Può funzionare?

Edit: ho provato, ma io linko 0238f76sd7b7s8f6s6d765f8b7f7b6f6_pippo_boh1.pdf ma in realtà nelal cartella condivisa il file si chiama pippo_boh1.pdf.
Ecco perchè non ho proseguito su questa strada.
Non posso perdere tempo a rinominare un file che ho già creato e messo in PIPPO...perché sono diverse centinaia da elaborare in questo modo.
 
Ultima modifica:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Devi utilizzare una tabella strutturata come ti ho mostrato nel post precedente, rileggi bene quanto ho scritto. Non ti serve appendere il nome all'hash. Devi sfruttare il database per memorizzare il nome del file.

I file che hai già creato e messi in PIPPO o nelle altre cartelle puoi rinominarli scrivendoti uno script adhoc, che userai solo una volta.

Ora non riesco a farti esempi, prova da solo, altrimenti appena ho un pò di tempo ti scrivo qualche riga.
 
  • Mi piace
Reazioni: Moffetta88

jNash

Utente Attivo
1,327
105
Come posso usarlo solo una volta? Al momento ho provato e rischio di continuare nel processo di "rename" che poi mi sballa tutto.
Perchè gli step sono precisi...ho fatto dei tentativi di rinominare i file nelle cartelle, ma si incasina il tutto.
Devo cambiare obiettivo...
Mi andrebbe anche bene far scaricare l'intera cartella PIPPO (e le altre), magari zippate, dove per "mascherare" il nome dell'archivio posso passare prima l'hash al posto del file archivio. Mi sembra più fattibile...Comunque grazie.
 
Ultima modifica:

jNash

Utente Attivo
1,327
105
Ci sono quasi...questo il codice per creare l'archivio ZIP (trovato in rete e adattato alle mie esigenze) e per fare automaticamente il download dell'archivio.

HTML:
<?php
$zip = new ZipArchive();
$nomeZip = "archivio.zip";
if ($zip->open($nomeZip, ZIPARCHIVE::CREATE) !== TRUE) {
exit("impossibile creare l'archivio zip");
}

$zip->addFile("PIPPO/file1.txt");
$zip->addFile("PIPPO/file2.txt");
$zip->close();

header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$nomeZip);
header('Content-Length: ' . filesize($nomeZip));
readfile($nomeZip);

?>

Devo fare però un ciclo dentro PIPPO per prendere tutti i file, tranne uno che non mi serve venga scaricato...
I nomi file li ho anche nella tabella...forse è più facile fare una query?
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Intendo dire che crei uno script che lanci per modificare i nomi dei file che sono già stati caricati, così eviti di fare l'operazione a mano.
Devi solo elencare i file che hai nella cartella e ricorsivamente assegnare un nome (usando md5) e salvare a db.



In merito al resto, crea la tabella che ho mostrato sopra.
Non ho capito perchè ti complichi la vita con soluzioni come quelle... quella che ti ho suggerito è una soluzione anche semplice, oltre che utilizzata.

Un esempio:

PHP:
$file_name  = "pippo.pdf";      // nome del file che avrai già spostato
$md5_name = md5(time());    // MD5, puoi aggiungere anche altri criteri
$id_user = .... ; // ID utente connesso

$sql = "INSERT INTO user_files(id_user, file_name, md5_name) VALUES (?,?,?)";
$stmt= $pdo->prepare($sql);
$stmt->execute([$id_user, $file_name, $md5_name]);

rename($file_name, $md5_name);

Quando andrai a leggere la tabella farai tipo:
PHP:
$stmt = $pdo->prepare("SELECT * FROM user_files WHERE id_user = :id");
$stmt->execute(['id' => $id]);
$files = $stmt->fetch();

foreach($files as $file)
    echo "<a href='" . $file["md5_name"]."'>".$file["file_name"]."</a><br>";

Poi se vuoi fornire anche lo zip, ti è sufficiente richiamare la action "scaricaZipFiles" e usare l'id dell'utente che è collegato; questo lo usi per cercare in quella tabella tutti i files di quell'utente.
 

jNash

Utente Attivo
1,327
105
Preferisco il download dello zip, perché non ho l'esigenza di mostrare l'elenco....inizialmente era una soluzione che avevo valutato.
Considera poi che queste cartelle vengono popolate di continuo, nel senso file aggiunti nelle condivise di continuo. Quindi ogni volta che aggiorno si innescherebbe il rename dei file nuovi e di quelli già rinominati. Dovrei fare ulteriori controlli.
Alla fine, visto che mi basta far scaricare lo zip, non perdo altro tempo.
Ho capito la tua soluzione e l'ho realizzata. Ma poi per i nuovi files non mi sono messo a fare controlli. Tnx!
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Quindi ogni volta che aggiorno si innescherebbe il rename dei file nuovi e di quelli già rinominati.

Scegli pure la soluzione che ritieni più adatta. Comunque non è come dici qui sopra: rinomini solo quando sposti il file, all'upload. Il resto rimane invariato. ;)
 

jNash

Utente Attivo
1,327
105
Scegli pure la soluzione che ritieni più adatta. Comunque non è come dici qui sopra: rinomini solo quando sposti il file, all'upload. Il resto rimane invariato. ;)
I file li copio nelle cartelle, con un banale copia/incolla, quindi quando vado a rinominare prendo tutti i file contenuti nella cartella. Discorso analogo per le altre cartelle. Come posso evitare di non rinominare file già rinominati, se non attraverso dei controlli? Grazie.
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
A questo punto dovresti postare la parte di codice interessata, perchè senza vedere ciò che fai risulta complicato aiutarti.
 

Dumah Brazorf

Utente cAttivo
Utente Èlite
7,613
3,543
I file li copio nelle cartelle, con un banale copia/incolla, quindi quando vado a rinominare prendo tutti i file contenuti nella cartella.
Why? Sai il path completo del file che hai appena caricato, calcola l'hash e rinominalo subito.
Per tutti i file caricati in precedenza c'è da fare una funzione da lanciare una sola volta e dimenticare.
 

jNash

Utente Attivo
1,327
105
Non voglio farvi perdere tempo, vi ringrazio per le dritte, ma sono convinto al download dello zip. Il perché è da ricercarsi nel processo che ho messo in atto e che funziona, nel popolare le cartelle e poi la tabella del db.
Visto il codice che ho riportato dello zip, basta fare una query per trovare i nomi dei file dentro PIPPO e poi passare la funzione che inserisce i suddetti file nell'archivio? Grazie.
 
Ultima modifica:

jNash

Utente Attivo
1,327
105
Ho quasi finito!
Genero archivio.zip nella carella che contiene le altre cartelle PIPPO, PLUTO, etc...parte il download ma poi lo zip non si apre.
Eppure nella cartella condivisa il file c'è e da lì lo apro!
La struttura è questa:
DIR/PIPPO/pippo_boh1.pdf, pippo_boh2.pdf,...
/PLUTO/pluto_boh1.pdf, pluto_boh2.pdf,...
/etc etc
Io genero il file DIR/archivio.zip
da //IP server/DIR/archivio.zip lo apro perché la mia utenza di windows ha i permessi per accedere in DIR, mentre se faccio il download del file poi non lo apro.

Il codice per il download è questo:

PHP:
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename='.$nomeZip);
header('Content-Length: ' . filesize($nomeZip));
readfile($nomeZip);


dove $nomeZip = "DIR/"."archivio.zip";

Se però apro il browser e digito http://IP/DIR/archivio.zip si apre perfettamente!

Credo debba modificare "readfile($nomeZip);" oppure il filename

perché il link del file archivio, quando lo scarico non è quello http...che ho indicato, ecco perché non si apre.

Grazie.
 
Ultima modifica:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Il filename mi sembra debba essere tra apici, ed è sufficiente il nome del file, non il path.

Di solito è una buona idea fare una cosa come questa comunque:

PHP:
$file = tempnam(sys_get_temp_dir(), "zip");
$zip = new \ZipArchive();
$zip->open($file, \ZipArchive::OVERWRITE);

// add files...
// close zip

header('Content-Type: application/zip');
header('Content-Length: ' . $size);
header('Content-Disposition: attachment; filename="File_' . $nome_utente . '.zip"');
readfile($file);
unlink($file);
 
Stato
Discussione chiusa ad ulteriori risposte.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili