• Home
  • Forum
  • Fare Web
  • PHP

[PHP] upload di file in cartella e sua sicurezza

  • Creatore Discussione Creatore Discussione VAik
  • Data di inizio Data di inizio 27 Set 2016
Prec.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
Succ.
Primo Prec. 4 di 7 Succ. Ultimo

xnotar

Utente Attivo
3 Apr 2012
65
0
6
  • 12 Dic 2016
  • #61
marino51 ha scritto:
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 ?
Clicca per allargare...
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: 12 Dic 2016

marino51

Utente Attivo
28 Feb 2013
3.205
207
63
Lombardia
  • 12 Dic 2016
  • #62
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
  • 12 Dic 2016
  • #63
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
Clicca per allargare...
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
Clicca per allargare...
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
  • 12 Dic 2016
  • #64
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
  • 12 Dic 2016
  • #65
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.205
207
63
Lombardia
  • 12 Dic 2016
  • #66
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
  • 12 Dic 2016
  • #67
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.044
150
63
PR
www.borgo-italia.it
  • 12 Dic 2016
  • #68
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?
 
Reactions: marino51

xnotar

Utente Attivo
3 Apr 2012
65
0
6
  • 12 Dic 2016
  • #69
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.205
207
63
Lombardia
  • 12 Dic 2016
  • #70
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.205
207
63
Lombardia
  • 12 Dic 2016
  • #71
borgo italia ha scritto:
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?
Clicca per allargare...
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.205
207
63
Lombardia
  • 12 Dic 2016
  • #72
Poi ho provato ora a caricare un .mtl che non è elencato nella funzione e me lo ha caricato.
Clicca per allargare...
quando ti succede, per favore pubblica anche ... l'echo dei valori, così posso cercare di capire di più
 
Ultima modifica: 12 Dic 2016

xnotar

Utente Attivo
3 Apr 2012
65
0
6
  • 12 Dic 2016
  • #73
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.205
207
63
Lombardia
  • 12 Dic 2016
  • #74
intanto togli questo,
// 'application/octet-stream',
sembra sia un generico associato a file "sconosciuti"
 

marino51

Utente Attivo
28 Feb 2013
3.205
207
63
Lombardia
  • 12 Dic 2016
  • #75
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
  • 13 Dic 2016
  • #76
Ok, più tardi provo e posto i risultati.
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
  • 13 Dic 2016
  • #77
marino51 ha scritto:
lascia perdere la soluzione finfo, sostituisci così
Clicca per allargare...
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.205
207
63
Lombardia
  • 13 Dic 2016
  • #78
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
  • 13 Dic 2016
  • #79
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.
Clicca per allargare...
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.
Clicca per allargare...

togliendo il
application/octet-stream
Clicca per allargare...
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: 13 Dic 2016

marino51

Utente Attivo
28 Feb 2013
3.205
207
63
Lombardia
  • 13 Dic 2016
  • #80
ottimo, ricordati solo "finfo" dopo le prove
 
Prec.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
Succ.
Primo Prec. 4 di 7 Succ. Ultimo
Devi accedere o registrarti per poter rispondere.

Discussioni simili

S
[PHP] Upload stesso file
  • solari77
  • 24 Giu 2019
  • PHP
Risposte
14
Visite
3K
PHP 5 Lug 2019
mr.x
M
G
[PHP] upload file in server: percorso cartella
  • giacomo9783
  • 30 Dic 2018
  • PHP
Risposte
2
Visite
2K
PHP 31 Dic 2018
giacomo9783
G
M
Upload 4 file php
  • Maxi_007
  • 29 Ott 2018
  • PHP
Risposte
11
Visite
3K
PHP 9 Nov 2018
macus_adi
M
[PHP] Nome file, upload e rinominare
  • Marco Candian
  • 20 Lug 2018
  • PHP
Risposte
2
Visite
3K
PHP 20 Lug 2018
Marco Candian
M
M
[PHP] upload di un file esistente overwrite
  • Marchese M
  • 22 Feb 2018
  • PHP
Risposte
1
Visite
2K
PHP 22 Feb 2018
macus_adi
N
[PHP] Test per l'upload di file attraverso un bot Telegram
  • nino2018
  • 14 Feb 2018
  • PHP
Risposte
2
Visite
2K
PHP 15 Feb 2018
nino2018
N
C
[PHP] Problema upload file (multiplo)
  • ciccioroky
  • 3 Lug 2017
  • PHP
Risposte
1
Visite
2K
PHP 3 Lug 2017
borgo italia
S
[PHP] Upload file...
  • stefanoxjx
  • 24 Feb 2017
  • PHP
Risposte
6
Visite
2K
PHP 9 Mar 2017
stefanoxjx
S
[PHP] Aggiornare DB tramite UPLOAD file .csv
  • giancadeejay
  • 1 Dic 2016
  • PHP
  • 2
Risposte
39
Visite
6K
PHP 6 Dic 2016
borgo italia
V
File upload.php della guida, ma ha un errore
  • VAik
  • 20 Apr 2016
  • PHP
Risposte
8
Visite
2K
PHP 29 Apr 2016
Messiah84
M
[Problema] esecuzione script Upload file in php
  • francesco7
  • 31 Ago 2014
  • PHP
Risposte
0
Visite
1K
PHP 31 Ago 2014
francesco7
I
upload file php / javascript / mysql
  • Ivano Cardassi
  • 12 Ago 2014
  • PHP
Risposte
0
Visite
1K
PHP 12 Ago 2014
Ivano Cardassi
I
R
upload file php
  • rickypictures
  • 6 Giu 2014
  • PHP
Risposte
5
Visite
2K
PHP 10 Giu 2014
marino51
L
[PHP e FTP upload] controllo file allegato
  • luigi777
  • 19 Giu 2012
  • PHP
Risposte
6
Visite
3K
PHP 20 Giu 2012
luigi777
L
PHP upload file
  • novello88
  • 6 Mar 2012
  • PHP
Risposte
1
Visite
2K
PHP 7 Mar 2012
maxbossi
B
[PHP - MySQL] Upload di un File
  • B-enemy
  • 17 Set 2009
  • PHP
Risposte
6
Visite
3K
PHP 19 Set 2009
B-enemy
B
M
UPLOAD File in PhP
  • moscacieca
  • 28 Gen 2009
  • PHP
Risposte
3
Visite
3K
PHP 30 Gen 2009
moscacieca
M
S
Upload File in Php
  • superciccio14
  • 31 Mag 2006
  • PHP
Risposte
7
Visite
2K
PHP 31 Mag 2006
superciccio14
S
[help] upload file con php!!!
  • nicocade
  • 2 Feb 2006
  • PHP
Risposte
1
Visite
1K
PHP 16 Feb 2006
metalgemini
L
Upload di un'immagine all'interno di un database usando php
  • lollo_x
  • 9 Giu 2020
  • PHP
Risposte
6
Visite
1K
PHP 12 Giu 2020
MarcoGrazia
Condividi:
Facebook X (Twitter) LinkedIn WhatsApp e-mail Condividi Link
  • Home
  • Forum
  • Fare Web
  • PHP
  • Italiano
  • Termini e condizioni d'uso del sito
  • Policy Privacy
  • Aiuto
  • Home
Community platform by XenForo® © 2010-2024 XenForo Ltd. | Traduzione a cura di XenForo Italia
Menu
Accedi

Registrati

  • Home
  • Forum
    • Nuovi Messaggi
    • Cerca...
  • Novità
    • Featured content
    • Nuovi Messaggi
    • Ultime Attività
X

Privacy & Transparency

We use cookies and similar technologies for the following purposes:

  • Personalized ads and content
  • Content measurement and audience insights

Do you accept cookies and these technologies?

X

Privacy & Transparency

We use cookies and similar technologies for the following purposes:

  • Personalized ads and content
  • Content measurement and audience insights

Do you accept cookies and these technologies?