[PHP] upload di file in cartella e sua sicurezza

xnotar

Utente Attivo
3 Apr 2012
65
0
6
Cambiando posto alle due variabili, riesco ad uplodare i file tipo jpg, png ecc... ma non quelli tipo stl, dwg, igs ecc...
Ora provo a mettere un var_dump come mi hai suggerito e vedo cosa mi restituisce.
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
ho messo il var_dump e inviando un file .stl mi restituisce:
string(3) "stl" Rapporto di invio:

Il file non è del tipo corretto.


Spiacente, il tuo file non è stato caricato!
Verifica e correggi gli errori elencati e riprova.
dunque lo riconosce correttamente. mi chiedo perché non debba accettarlo poi sull'invio.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
hai messo nell'array le estenzioni che ti servono?
PHP:
$tipo=array('jpg','gif','png','stl','..ecc...'};
perchè vedo che ti ta per stl
string(3) "stl" Rapporto di invio:
Il file non è del tipo corretto.
quindi vuol dire che legge l'estenzione (var_dump) ma che non la trova nell'array
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
il mio array è questo:
PHP:
$tipo=array('jpg','jpeg','gif','png','dwg','dxf','igs','stl','3dm','3dmf');

Noto che nel tuo esempio di array hai usato una parentesi graffa anziché tonda. È un errore di digitazione o va messa così?
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
il problema non potrebbe essere invece nel controllo del mime?
Cioè in questa parte di codice:
PHP:
// Check if image file is a actual image or fake image
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "Rapporto di invio:<br><br>Il file è del tipo corretto -- TIPO -- " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "Rapporto di invio:<br><br><ERRORE:<br>Il file non è del tipo corretto.<br><br>";
        $uploadOk = 0;
    }
}
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
Ho provato ora a fare un test con un servizio online per identificare correttamente il MIME Type inviando un semplice file .stl che contiene un cubo in 3D, il risultato di questo servizio è questo:


file1:
name: cubo.stl
type: application/sla
tmp_name: /tmp/phproQuTd
error: 0
size: 684
Filename: /tmp/phproQuTd
MIME type application/sla is deprecated
Fileinfo: application/octet-stream is failed
file: application/octet-stream is failed
Detected MIME: application/octet-stream is failed
MIME Crutch: application/octetstream is failed

Mi pare di intuire che dovrei usare nel codice "application/sla" (che tra l'altro dice poi "deprecated") ma non saprei come fare, visto che dovrei accettare anche immagini .jpg .png ecc... per gli sketch.
Esiste un modo per usare lo stesso codice per accettare tutte le estensioni che mi servono o dovrei usare un form di upload per ogni tipo di MIME?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
la graffa è un errore di digitazione
poi una cosa per gli altri 'dwg','dxf','igs','3dm','3dmf' funziona?
posta un file stl (eventualmente zippato) che provo
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
una cosa di cui mi sono accorto ora, per ricavare il nome e l'estenzione tu usi
$_FILES["fileToUpload"]["tmp_name"]
guarda che indipendentemente dal tipo di file $_FILES["fileToUpload"]["tmp_name"] ti restituisce (prova col var_dump) qualcosa del genere
string(27) "C:\Windows\Temp\phpA6D1.tmp"
è evidente che tmp non viene accettato
devi usare, per sapere il nome del file e quindi la sua etenzione, $_FILES["fileToUpload"]["name"]
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
prova a parte con i tuoi file questo mini script
PHP:
<?php
if(isset($_POST['invia'])){
    echo "<pre>";
    var_dump($_FILES["fileToUpload"]["name"]);
    var_dump($_FILES["fileToUpload"]["tmp_name"]);
    $estenzione=strtolower(pathinfo($_FILES["fileToUpload"]["name"],PATHINFO_EXTENSION));
    var_dump($estenzione);
    $estenzion_tmp=strtolower(pathinfo($_FILES["fileToUpload"]["tmp_name"],PATHINFO_EXTENSION));
    var_dump($estenzion_tmp);
    echo "</pre>";
    $tipo=array('jpg','jpeg','gif','png','dwg','dxf','igs','stl','3dm','3dmf'); ;
    if(!in_array($estenzione,$tipo)){
        echo "$estenzione file NON consentito<br>";
    }else{
        echo "$estenzione file consentito<br>";
    }
}
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">
<input name="fileToUpload" type="file">
<input name="invia" type="submit">
</form>
l'ho provato con tre tipi di file (non ho file tipo dxf igs stl 3dm 3dmf) e questo è il risultato
string(7) "ch4.dwg"
string(27) "C:\Windows\Temp\php4B3E.tmp"
string(3) "dwg"
string(3) "tmp"
dwg file consentito

string(23) "gianni-002.jpg"
string(27) "C:\Windows\Temp\phpE23E.tmp"
string(3) "jpg"
string(3) "tmp"
jpg file consentito //analogo per gif e png

string(22) "ci_gianni_catelani.doc"
string(27) "C:\Windows\Temp\php3D1C.tmp"
string(3) "doc"
string(3) "tmp"
doc file NON consentito
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
Ok! con questo script mi dice che i file di esempio .stl , .3dm , .png sono consentiti, mentre il file .mp3 (giustamente) no.
string(8) "cubo.stl"
string(14) "/tmp/phpjmxIGk"
string(3) "stl"
string(0) ""

stl file consentito

string(11) "LOGO 3D.3dm"
string(14) "/tmp/phpABrUZ6"
string(3) "3dm"
string(0) ""

3dm file consentito

string(13) "alluminio.png"
string(14) "/tmp/phpCocvEM"
string(3) "png"
string(0) ""

png file consentito

string(23) "2016-11-03-11:30:00.mp3"
string(14) "/tmp/phpmpwM9M"
string(3) "mp3"
string(0) ""

mp3 file NON consentito
Ora devo capire perché con l'altro script invece non si uplodano.

P.S.: dove posso mandartelo un file .stl di prova?
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
Ho provato a cambiare l'estensione ad un file .php in .png per imbrogliarlo e ovviamente lo script dice che il file e consentito. Chiaramente li non c'è nessun controllo del MIME TYPE
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
Ho provato a cambiare l'estensione ad un file .php in .png per imbrogliarlo e ovviamente lo script dice che il file e consentito. Chiaramente li non c'è nessun controllo del MIME TYPE
mi permetto di postarti uno script di esempio (in realtà una funzione) per l'upload di un file,
puoi farne una comparazione con quanto hai sviluppato/usato, in particolare considera come è stata usata la variabile
"$Allegato_type", devi trovare i valori restituiti per ciascun tipo di file che vuoi trattare,
al limite caricane uno per volta vedendo il risultato
PHP:
      <td><label for="Allegato">Allegato :</label></td>
      <td><input type="file" name="Allegato" id="Allegato" /></td>

function GestisciAllegato() {
  global $Allegato;

  $Allegato = "";
  if ($_FILES["Allegato"]["error"] == 4)
    return true;
  else {
    if ($_FILES["Allegato"]["error"] > 0) {
      print "<font color=red>Upload Return Code: ".$_FILES["Allegato"]["error"]."</font><br />";
      return false;
  } }

  $Allegato_name = $_FILES["Allegato"]["name"];
  $Allegato_type = $_FILES["Allegato"]["type"];
  $Allegato_size = $_FILES["Allegato"]["size"] / 1024;
  $Allegato_temp = $_FILES["Allegato"]["tmp_name"];
  $Allegato_path = dirname($_FILES["Allegato"]["tmp_name"]);
  $Allegato      = $Allegato_path."/".$Allegato_name;

  if ( ($Allegato_size == 0)            // vale parametro di php.ini
  || ( ($Allegato_type <> "image/gif")
    && ($Allegato_type <> "image/jpeg")
    && ($Allegato_type <> "image/pjpeg")
    && ($Allegato_type <> "application/zip")
    && ($Allegato_type <> "application/x-zip-compressed")
    && ($Allegato_type <> "application/x-shockwave-flash")
  ) ) {
    print "<font color=red>Dimensione o Tipo di file non valido</font><br />";
    // return false;
  }

  print "<tr><td>Upload : </td><td>".$Allegato_name."</td></tr>";
  print "<tr><td>Type : </td><td>".$Allegato_type."</td></tr>";
  print "<tr><td>Size (kB) : </td><td>".$Allegato_size."</td></tr>";
  print "<tr><td>Stored in : </td><td>".$Allegato_temp."</td></tr>";
  print "<tr><td>folder : </td><td>".$Allegato_path."</td></tr>";
  print "<tr><td>new file : </td><td>".$Allegato."</td></tr>";

  if (file_exists($Allegato)) {
    print "<font color=red>".$Allegato." esiste sul server<br />";
    print "lo cancello per sostituirlo con il nuovo file trasferito</font><br />";
    unlink($Allegato);
  }

  // move_uploaded_file($Allegato_temp, $UploadPath.$Allegato_name); <<-- non gestito

  rename ($Allegato_temp, $Allegato);
  if (file_exists($Allegato)) {
    print "<font color=green>".$Allegato." Upload eseguito con successo</font><br />";
  }
  return true;
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
Grazie!
Domani lo analizzo per cercare di capirlo (non sono ferratissimo in materia) poi lo provo e vediamo se riesco a far funzionare questa cosa.
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
Praticamente dovrei usare una variabile per ogni tipo (TYPE) da controllare, giusto?
Dunque l'elenco che servirebbe a me per quelle 10 estensioni, sarebbe questo:
.3dm x-world/x-3dmf
.3dmf x-world/x-3dmf

.stl application/sla
.stl application/vnd.ms-pki.stl
.stl application/x-navistyle

.iges application/iges
.iges model/iges

.igs application/iges
.igs model/iges

.dxf application/dxf
.dxf image/vnd.dwg
.dxf image/x-dwg

.dwg application/acad
.dwg image/vnd.dwg
.dwg image/x-dwg

.png image/png

.gif image/gif

.jpeg image/jpeg
.jpeg image/pjpeg

.jpg image/jpeg
.jpg image/pjpeg
Togliendo quelli doppi, sarebbero 14 tipi da inserire.
Ora devo capire come inserire nel mio script questa funzione di controllo.
Puoi aiutarmi per modificare quello che sto usando io?
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
per cortesia posta la versione attuale del tuo script e l'elenco completo dei tipi che vuoi gestire (come elencati in parte nel tuo ultimo post)
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
Allora..
Lo script attuale è questo:
PHP:
<?php
$target_dir = "models/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = strtolower(pathinfo($_FILES["fileToUpload"]["name"],PATHINFO_EXTENSION));//in modo che sia sempre tutto minuscolo
var_dump($imageFileType);
// Check if image file is a actual image or fake
if(isset($_POST["submit"])) {
    $check = getimagesize($_FILES["fileToUpload"]["tmp_name"]);
    if($check !== false) {
        echo "Rapporto di invio:<br><br>Il file è del tipo corretto -- TIPO -- " . $check["mime"] . ".";
        $uploadOk = 1;
    } else {
        echo "Rapporto di invio:<br><br><ERRORE:<br>Il file non è del tipo corretto.<br><br>";
        $uploadOk = 0;
    }
}
// Check if file already exists
if (file_exists($target_file)) {
    echo "<br><br>ERRORE:<br>Il nome scelto per il file esiste già. Rinomina il tuo file!<br>";
    $uploadOk = 0;
}
// Check file size
if ($_FILES["fileToUpload"]["size"] > 5000000) {
    echo "<br>Il tuo file ha una dimensione troppo grande. Carica un file che non superi i 5Mb<br>";
    $uploadOk = 0;
}
$tipo=array('jpg','jpeg','gif','png','dwg','dxf','igs','stl','3dm','3dmf');//aggiungi e/o togli le estenzioni che ti interessano
    //verifico che l'estensione sia tra i tipi ammessi
if(!in_array($imageFileType,$tipo)){//l'estensione non è nell'arrai
    echo "<br>Solo i files di tipo JPG, JPEG, GIF, PNG, DWG, DXF, IGS, STL, 3DM, 3DMF,  possono essere caricati.<br>";//se vuoi elencarli oppure
    //echo "<br>non è ammesso caricare file tipo $imageFileType.<br>";
    $uploadOk = 0;//file NON consentito
}
// Check if $uploadOk is set to 0 by an error
if ($uploadOk == 0) {
    echo "<br>Spiacente, il tuo file non è stato caricato!<br> Verifica e correggi gli errori elencati e riprova.";
// if everything is ok, try to upload file
} else {
    if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)) {
        echo "<br><br><br>Il file --  ". basename( $_FILES["fileToUpload"]["name"]). " -- è stato caricato correttamente.";
    } else {
        echo "<br>Spiacente, si è verificato un'errore durante l'invio del tuo file.";
    }
}
?>

Le estensioni che vorrei poter far caricare dai miei collaboratori, sono queste:
JPG, JPEG, GIF, PNG, DWG, DXF, IGS, STL, 3DM, 3DMF,

e i 14 MIME TYPE per quelle estensioni sono questi:
x-world/x-3dmf
application/sla
application/vnd.ms-pki.stl
application/x-navistyle
application/iges
model/iges
application/dxf
application/acad
image/vnd.dwg
image/x-dwg
image/png
image/gif
image/jpeg
image/pjpeg
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
ho cercato di scriverlo in una forma molto comprensibile, l'ho provato e funziona, ma non ho provato tutti i casi,
be so kind to complete the test !
non ho usato il "move" perché "non funziona", copia e cancellazione del file temporaneo funzionano
ho preferito racchiudere il tutto in una funzione, che può essere collocata ovunque nello script php ed è richiamabile con
"$uploadOk = GestisciUpload();"

PHP:
<?php
if(isset($_POST['submit']))
{
    $uploadOk = GestisciUpload(); // $uploadOk = 1 : OK

    // qui va gestito il comportamento successivo
}
else
{
    // questa parte serve solo per provare lo script
    DisplayForm();
}


function GestisciUpload()
{
    $target_dir = "models/"; // terminato con la barra !

    $allowed_type=array(
        'x-world/x-3dmf',
        'application/sla',
        'application/vnd.ms-pki.stl',
        'application/x-navistyle',
        'application/iges',
        'model/iges',
        'application/dxf',
        'application/acad',
        'image/vnd.dwg',
        'image/x-dwg',
        'image/png',
        'image/gif',
        'image/jpeg',
        'image/pjpeg'
    );

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

    $file_name = strtolower($_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 />";

    // 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);
    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;
}

function DisplayForm()
{
?>
<!DOCTYPE html>
<form action="" method="post" enctype="multipart/form-data">
    File da caricare : <input type="file" name="fileToUpload" id="fileToUpload" />
    <br /> <br />
    <input name="submit" type="submit" id="submit" value="Submit">
    <br /> <br />
</form>
</html>
<?PHP
}
?>
ps, ho eliminato la dir di prova dove spostare il file
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
Cattura.PNG

giusto per essere sicuri ....
 

marino51

Utente Attivo
28 Feb 2013
3.204
207
63
Lombardia
un paio di cosine di abbellimento,

per gestire cartelle di destinazione diverse, si può passare il path come parametro, considerando il default se omesso
PHP:
function GestisciUpload($target_dir = "models/")
{
    $allowed_type=array(

da cui

    $cartella = "C:/Web_Sites/__Test/PHP/TEST/_xnotar/";
    $uploadOk = GestisciUpload($cartella); // $uploadOk = 1 : OK

oppure, per usare il default

    $uploadOk = GestisciUpload(); // $uploadOk = 1 : OK

conviene inserire il controllo se la cartella di destinazione esiste
PHP:
    // 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($_FILES['fileToUpload']['name']);     // nome originale del file

volendo eliminare la funzione di upload dallo script per rendere lo script principale più corto e leggibile,
é possibile metterla in un file php separato (es. function_upload.php) nella stessa cartella dello script principale
PHP:
    require_once 'function_upload.php';
    $cartella = "C:/Web_Sites/__Test/PHP/TEST/_xnotar/";
    $uploadOk = GestisciUpload($cartella); // $uploadOk = 1 : OK
e non ci si pensa più
 
Ultima modifica:

xnotar

Utente Attivo
3 Apr 2012
65
0
6
Grazie Marino51.
Sto provando ora il tuo script così come è. il risultato è questo:
Upload : cubo.stl
Type : application/sla
Size (kB) : 0.66796875
Stored in : /tmp/php01sfup
target folder : models/
target file : models/cubo.stl
ERRORE : Lo spostamento del file nella destinazione non è riuscito
praticamente non mi sposta il file nella directory di destinazione.
Poi ho provato qualche estensione. Il jpg ed il stl li riconosce correttamente, mentre se provo a caricare un 3dm, il risultato è questo:
Upload : logo 3d.3dm
Type : application/octet-stream
Size (kB) : 1524.0625
Stored in : /tmp/phpdpypf6
target folder : models/
target file : models/logo 3d.3dm
ERRORE : Il file non è del tipo corretto.
Non lo riconosce.
Non ho ancora provato tutti i formati, per ora al primo test i risultati sono questi.
 
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