[PHP] upload di file in cartella e sua sicurezza

  • Creatore Discussione Creatore Discussione VAik
  • Data di inizio Data di inizio
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.
 
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.
 
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
 
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ì?
 
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;
    }
}
 
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?
 
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
 
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"]
 
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
 
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?
 
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
 
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;
 
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.
 
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?
 
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)
 
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
 
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:
Cattura.PNG

giusto per essere sicuri ....
 
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:
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