[PHP] upload di file in cartella e sua sicurezza

xnotar

Utente Attivo
3 Apr 2012
65
0
6
no non devi modificare lo script,

descrivo il funzionamento con Windows,
scelgo il file nella pagina html,
il file viene già trasferito al server prima del "submit" quindi si trova nella "/tmp/"
clicco "submit",
viene attivato lo script php che lo gestisce, ovvero come ti ho suggerito,
il file verrà scritto nella "/tmp/" e verrà cancellato il temporaneo
vero ?
Anche senza modificare lo script non si scrive nessun file nella tmp.
La prova che mi hai suggerito tu, non l'ho ancora fatta, ma oggi pomeriggio sono a casa, e provo anche quella.
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
che i file vengano caricati nella "/tmp/" è sicuro, i due esempi che ho postato sono stati presi dai tuoi post, rispettivamente,
post 26 : tmp_name: /tmp/phproQuTd
post 41 : Stored in : /tmp/phpjlpbwo
quindi segui passo passo, in modo da verificare che il problema sia proprio legato alle autorizzazioni
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
Fatto la prova...
Allora, ho prima vuotato la /tmp così da poter vedere meglio ciò che accade.
Nel preciso istante in cui premo il tasto "sfoglia", si crea una cartella nella /tmp con questo nome
systemd-private-0c3a38870f3748cf845c98de6a6a28ad-systemd-hostnamed.service-vh1JmR
e all'interno di quella se ne forma un'altra chiamata tmp.
Premo submit e praticamente non succede nulla. Il file non si crea, ne nella /tmp ne nella /tmp/systemd-private-0c3a38870f3748cf845c98de6a6a28ad-systemd-hostnamed.service-vh1JmR ne nell'ultima /tmp/systemd-private-0c3a38870f3748cf845c98de6a6a28ad-systemd-hostnamed.service-vh1JmR/tmp
Il risultato è questo.
Upload : cubo.stl
Type : application/sla
Size (kB) : 0.66796875
Stored in : /tmp/phpgkqyil
target folder : /tmp/
target file : /tmp/cubo.stl
ERRORE : Lo spostamento del file nella destinazione non è riuscito
Dopo una decina di secondi si cancella la directory con il nome lunghissimo ed anche la tmp al suo interno.

Dopo circa un minuto ancora, si crea (sempre in /tmp un'altra directory con il nome "plugtmp" ma non so se sia relativa all'operazione di upload o se sia il sistema che la crea per i fatti suoi.
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
Ora creo una cartella nella www chiamata tmp e tento di forzare lo script a scriverci dentro anziché usare quella di default del sistema.
Vediamo cosa succede.
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
Niente da fare, ho provato a cambiare nel php.ini l'inirizzo della tmp facendogli puntare quella creata da me in /var/www ma il risultato non cambia.
Getto la spugna!:(
Ma non capisco perché con il vecchio script i file andavano a buon fine (poi va beh solo quelli di immagini) e con questo non ne vogliono sapere di copiarsi nella directory di destinazione.
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
aspetta, l'ultima prova,
per cortesia sostituisci tutta la funzione, ho fatto diverse aggiunte rispetto ai post precedenti,
la logica non è cambiata, quindi non dovresti avere altro da modificare
PHP:
function GestisciUpload($target_dir = "models/")
{
    $allowed_type = array(
        'application/acad',
        'application/dxf',
        'application/iges',
        'application/octet-stream',
        'application/sla',
        'application/vnd.ms-pki.stl',
        'application/x-navistyle',
        'image/gif',
        'image/jpeg',
        'image/pjpeg',
        'image/png',
        'image/vnd.dwg',
        'image/x-dwg',
        'model/iges',
        'x-world/x-3dmf',
    );
    $UploadErrors = array(
        'There is no error, the file uploaded with success',
        'The uploaded file exceeds the upload_max_filesize directive in php.ini',
        'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
        'The uploaded file was only partially uploaded',
        'No file was uploaded',
        'Missing a temporary folder',
        'Failed to write file to disk',
        'A PHP extension stopped the file upload. PHP does not provide a way to ascertain which extension caused the file upload to stop; examining the list of loaded extensions with phpinfo() may help',
    );

    $err = $_FILES['fileToUpload']['error'];
    if ($err > 0 )
    {
        echo "ERRORE : ".( $err < 8 ? $UploadErrors[$err] : $err )."<br /><br />";
        return 0;
    }

    // controllo se esiste la cartella di destinazione
    if ( !is_dir($target_dir) )
    {
        echo "ERRORE : La cartella di destinazione non esiste<br /><br />";
        return 0;
    }

    $file_name = strtolower(basename($_FILES["fileToUpload"]["name"]));     // nome originale del file
    $file_type = strtolower($_FILES['fileToUpload']['type']);               // tipo
    $file_size = $_FILES['fileToUpload']['size'] / 1024;                    // dimensione in kB
    $file_temp = strtolower($_FILES['fileToUpload']['tmp_name']);           // path e nome assegnato dall'upload

    $file_path = $target_dir;
    $file      = $file_path.$file_name;

    // visualizzazioni da eliminare (commentare) in produzione
    echo "Upload : "        .$file_name    ."<br />";
    echo "Type : "        .$file_type    ."<br />";
    echo "Size (kB) : "        .$file_size    ."<br />";
    echo "Stored in : "        .$file_temp    ."<br />";
    echo "target folder : "    .$file_path    ."<br />";
    echo "target file : "    .$file        ."<br />";

    // $mime_type = ( new finfo(FILEINFO_MIME_TYPE) )->buffer( file_get_contents($file_temp) ); // extension=php_fileinfo.dll in php.ini
    // echo "MIME TYPE : "        .$mime_type    ."<br />";

    // controllo se è accettabile
    if ( !in_array($file_type, $allowed_type) )
    {
        echo "ERRORE : Il file non &egrave; del tipo corretto.<br /><br />";
        return 0;
    }

    // controllo la dimensione
    if ($file_size == 0)
    {
        echo "ERRORE : Il file &egrave; vuoto.<br /><br />";
        return 0;
    }
    if ($file_size > 5000)
    {
        echo "ERRORE : Il file ha una dimensione troppo grande. Carica un file che non superi i 5 Mb.<br /><br />";
        return 0;
    }

    // controllo se esiste lo stesso nome
    if ( file_exists($file) )
    {
        echo "ERRORE : Il nome scelto per il file esiste gi&agrave;. Rinomina il tuo file!<br /><br />";
        return 0;
    }

    // sposto il file nella destinazione (copia e cancellazione, move non funziona)
    // $err = copy($file_temp, $file);
    // unlink($file_temp);

    $err = move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $file);
    if ( !$err ) {
        echo "ERRORE : Lo spostamento del file nella destinazione non &egrave; riuscito"."<br /><br />";
        return 0;
    }

    // controllo se il file é arrivato a destinazione
    if (!file_exists($file))
    {
        echo "ERRORE : Il file non &egrave; arrivato a destinazione<br /><br />";
        return 0;
    }

    // non ho altro da fare
    echo "Il file -- ".$file_name." -- &egrave; stato caricato correttamente.";
    return 1;
}
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
:)Grande! così funziona.
Non ho provato tutte le estensioni, però rimane un problema legato alla sicurezza. se rinomino un file in php cambianogli l'estensione in .jpg , me lo carica sul server.
È piuttosto strano perché se fa il controllo del MIME TYPE dovrebbe accorgersi dell'inganno.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
il mio codice (che uso da anni) e quello di Marino51 a me funzionano, quindi a questo punto penso che il problema non sia nel codice, ma forse settaggi di php oppure poer caso hai un file htaccess che permetta solo le immagini?
lo stai provando in locale o remoto?
 
  • Like
Reactions: marino51

xnotar

Utente Attivo
3 Apr 2012
65
0
6
Sono in locale. Devo essere sicuro del funzionamento coretto prima di renderlo operativo.
Non ho un .htaccess specifico al momento, sto solo provando il file puro così com'è nella radice del server richiamandolo dal form.
Ora con quest'ultima modifica funziona, nel senso che i file almeno arrivano a destinazione ed alcuni non di quelli elencati vengono rifiutati es. uno .zip o un .php me li blocca, ma se gli cambio l'estensione per fregarlo, i file passano tranquillamente. Poi ho provato ora a caricare un .mtl che non è elencato nella funzione e me lo ha caricato.
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
ho letto che i il tipo dipende dal browser, utilizzo IE 11 e se cambio l'estensione, lo script riceve correttamente il tipo di file

se guardi lo script, vedi queste righe commentate
PHP:
    // $mime_type = ( new finfo(FILEINFO_MIME_TYPE) )->buffer( file_get_contents($file_temp) ); // extension=php_fileinfo.dll in php.ini
    // echo "MIME TYPE : "  .$mime_type."<br />";
in questo modo è php a restituire il tipo (oltre al browser)
ma per attivare queste righe è necessiario sia attiva l'estensione "fileinfo" in php.ini
io ho duvuto attivarla perché non lo era di default,
se apri con un editor php.ini e cerchi fileinfo vedi se esiste ed attivo,
se non lo fosse va aggiunto nella parte finale del file dove ci sono tutte le estensioni (plugin come si dice oggi)
il nome del file potrebbe essere diverso da Windows, probabilmente il suo nome è fileinfo.so
io lo trovo qui "C:\Program Files\PHP\v5.4\ext"
se lo aggiungi a php.ini, fai ripartire il solo server web in modo che legga le nuove definizioni
quindi attiva le due righe e speriamo non dia errore,
poi modifichiamo lo script per usare questa info invece che quella che deriva dal browser
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
ciao
il mio codice (che uso da anni) e quello di Marino51 a me funzionano, quindi a questo punto penso che il problema non sia nel codice, ma forse settaggi di php oppure poer caso hai un file htaccess che permetta solo le immagini?
lo stai provando in locale o remoto?
grazie @borgo italia, tieni un occhio sulla discussione, ho una conoscenza superficiale (nulla) di Linux, ormai quasi scordata quella di unix

in realtà la modifica per far funzionare l'upload l'ho cercata "in giro", come è messo ora lo script funziona anche in ambiente win, con IIS e browser IE11

grazie ancora
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
Poi ho provato ora a caricare un .mtl che non è elencato nella funzione e me lo ha caricato.
quando ti succede, per favore pubblica anche ... l'echo dei valori, così posso cercare di capire di più
 
Ultima modifica:

xnotar

Utente Attivo
3 Apr 2012
65
0
6
Grazie ragazzi.
Il php.ini non ho problemi a modificarlo, il problema sarà poi quando dovrò mettere tutto in remoto che il php.ini non sempre è modificabile, dunque speriamo in bene.
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
intanto togli questo,
// 'application/octet-stream',
sembra sia un generico associato a file "sconosciuti"
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
lascia perdere la soluzione finfo, sostituisci così
PHP:
    // $mime_type = ( new finfo(FILEINFO_MIME_TYPE) )->buffer( file_get_contents($file_temp) ); // extension=php_fileinfo.dll in php.ini
    // echo "MIME TYPE : "  .$mime_type."<br />";

    $mime_type = mime_content_type($file_temp);
    echo "MIME TYPE : ".$mime_type."<br />";
    $file_type = $mime_type;
e prova se puoi ancora bypassare (fregare) il controllo
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
lascia perdere la soluzione finfo, sostituisci così
In che punto la inserisco questa parte:
PHP:
    // $mime_type = ( new finfo(FILEINFO_MIME_TYPE) )->buffer( file_get_contents($file_temp) ); // extension=php_fileinfo.dll in php.ini
    // echo "MIME TYPE : "  .$mime_type."<br />";

    $mime_type = mime_content_type($file_temp);
    echo "MIME TYPE : ".$mime_type."<br />";
    $file_type = $mime_type;

Devo eliminare qualche altra parte per inserire questa o lascio tutto come è, a parte
PHP:
'application/octet-stream',
che ho già rimosso?
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
le due righe commentate, devono restare commentate, se non lo fossero "commentale"
le tre righe nuove vanno inserite immediatamente dopo le due righe citate,
nessun' altra modifica.
la funzione "mime_content_type" ha lo stesso compito di "finfo" solo che probabilmente verrà dismessa proprio perché sostituita da "finfo", ora per mettere a punto lo script possiamo usarla, ma per il futuro sarà bene attivare "finfo"

facci sapere, io sono curioso
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
OK! Scusate il ritardo ma sono riuscito solo ora a provare.
Fatta la modifica, ora sembra funzionare tutto correttamente, anche il tentativo di ingannare l'upload con un file .php camuffato da .jpg ha dato esito negativo (o meglio dire positivo visto che è quello che volevo per la sicurezza).
il risultato è stato questo:
Upload : test2.jpg
Type : image/jpeg
Size (kB) : 0.81640625
MIME TYPE :
ERRORE : Il file non è del tipo corretto.
mentre con file sconosciuti l'output è questo:
Upload : .swp
Type : application/octet-stream
Size (kB) : 12
MIME TYPE :
ERRORE : Il file non è del tipo corretto.

togliendo il
application/octet-stream
lo script ha fatto il suo dovere.
Come giustamente dicevi, è un MIME per file generici sconosciuti.

Ora farò varie prove incrociate nei prossimi giorni per verificare che vada tutto bene, ma sembrerebbe già di si.
Non so come ringraziarvi, siete veramente in gamba... Bravi!
 
Ultima modifica:
Discussioni simili
Autore Titolo Forum Risposte Data
S [PHP] Upload stesso file PHP 14
G [PHP] upload file in server: percorso cartella PHP 2
M Upload 4 file php PHP 11
M [PHP] Nome file, upload e rinominare PHP 2
M [PHP] upload di un file esistente overwrite PHP 1
N [PHP] Test per l'upload di file attraverso un bot Telegram PHP 2
C [PHP] Problema upload file (multiplo) PHP 1
S [PHP] Upload file... PHP 6
giancadeejay [PHP] Aggiornare DB tramite UPLOAD file .csv PHP 39
V File upload.php della guida, ma ha un errore PHP 8
francesco7 [Problema] esecuzione script Upload file in php PHP 0
I upload file php / javascript / mysql PHP 0
R upload file php PHP 5
L [PHP e FTP upload] controllo file allegato PHP 6
novello88 PHP upload file PHP 1
B [PHP - MySQL] Upload di un File PHP 6
M UPLOAD File in PhP PHP 3
S Upload File in Php PHP 7
nicocade [help] upload file con php!!! PHP 1
L Upload di un'immagine all'interno di un database usando php PHP 6
S Problemi con modulo upload video php (help!) PHP 0
F [PHP] Informazioni upload PHP 11
D [PHP] Upload intera cartella PHP 2
felino [PHP] Uploadify: upload immagini PHP 0
L [PHP] problema con upload e javascript (upload multiplo) Javascript 2
L [PHP] upload con errore PHP 2
V [PHP] Upload Excel in db PHP 0
jailbait [PHP] Upload immagine e stampa a schermo PHP 0
G PHP upload dati ed immagine PHP 7
F [PHP] Validare form prenotazione appuntamento tattoo con upload image PHP 0
D [PHP] Upload encrypt image PHP 0
P [PHP] Upload multiplo PHP 4
N [PHP] Problema upload immagini wordpress PHP 2
MarcoGrazia [PHP] Upload e successiva visualizzazione immagini in DB PHP 3
S PHP: Aiuto con upload immagini che si auto tuotano PHP 24
C [PHP] Upload immagine in un form con target _blank: non funziona PHP 7
A Upload multiplo di immagini in PHP PHP 3
L [php] upload controllo dimensione immagine PHP 8
F upload foto in php?????? PHP 2
R upload e ridimensionamento immagini in php PHP 0
R upload e ridimensionamento immagini in php PHP 1
L [PHP] Upload immagini e ridimensionamento automatico PHP 9
N [RISOLTO] Upload jpeg e pdf in folder (PHP) PHP 16
K [PHP] multi upload immagine da form PHP 60
L Passare ad uno script PHP i dati di un form incluso l'upload di un'immagine Ajax 0
N problema script php mysql multi upload immagini PHP 31
helpdesk Gif agli eventi di php Upload PHP 6
neo996sps [PHP + MySQL + Server Linux] Upload semi riuscito e query non eseguite PHP 2
Y [PHP/MySQL] Upload PDF PHP 3
O PHP ecommerce > da un sito funzionante > duplicazione riuscita ma non upload immagini PHP 19

Discussioni simili