[PHP] upload di file in cartella e sua sicurezza

  • Creatore Discussione Creatore Discussione VAik
  • Data di inizio Data di inizio

VAik

Utente Attivo
16 Apr 2016
117
3
18
Ciao a tutti ragazzi

anche se precedentemente ho affrontato questo problema di eseguire l'upload su una cartella , ora lo faccio con maggior cognizione di causa.

Ho creato la cartella "allegati" nella cartella principale del mio sito. In questa cartella andrò a memorizza l'immagine/documento.

Il programma mi funziona pure, però ho alcuni dubbi:

1)Questa cartella deve avere solo i permessi di scrittura , o tutti i permessi e quindi 777?

2)il file .htacces come si crea? chi lo crea?

3)per sicurezza bisogna mettere dei controlli, per fare in modo che nella cartella non ci sia nessun file exe e poi si vuole limitare la max dimensione del file

PHP:
$nomefile_tmp=$_FILES["allegato"]["tmp_name"];
$tipoallegato=$_FILES["allegato"]["type"];
$nomeallegato=$_FILES["allegato"]["name"]; //nome dell'allegato completo di estensione
$dimallegato=$_FILES["allegato"]["size"];//dimensione dell'allegato
if ($dimallegato > 5)
 echo "Spiacente, ma il file è troppo grande."; }

 if($tipoallegato != "jpg" && $tipoallegato!= "png" &&
$tipoallegato != "jpeg"    &&  $tipoallegato != "gif" ) {

  echo "spiacente, only JPG, JPEG, PNG & GIF files are allowed.";
          exit;}

if(isset($nomeallegato)){
    $okcopy=copy($nomefile_tmp,"$fullpath$nomeallegato");
}

if($okcopy){

    //recupero le info dal form
    $titolo=$_POST['titolo'];
    $desc=$_POST['descrizione'];
    $urlfoto='http://miositomiosito.org/'.$fullpath.$nomeallegato;
    //è l'indirizzo assoluto di dove si trova l'immagine
$rs=@mysqli_query($link,"INSERT INTO foto (titolo,descrizione,indirizzo_foto) VALUES('$titolo','$desc','$urlfoto')");
    //valorizzo le colonne titolo, descrizione, foto con i dati appena recuperati
    if($rs){
    echo "ok. Dati salvati<br>";
    echo "$urlfoto";
    echo "Prma info nome file temp: $nomefile_tmp<br>Seconda info tipo allegato: $tipoallegato<br>terza info nome allegato: $nomeallegato";
    }
    else{echo "riprova<br>";
    echo "$urlfoto";}

4)dalla guida di questo sito ho trovato anche questa istruzione per trovare l'estensione
$estenzione=pathinfo($nomeallegato, PATHINFO_EXTENSION);

è la stessa cosa?

5) ultima domanda, ma un programma del genere che a cosa può servire?
per esempio per poter caricare da parte di un utente del mio sito, la sua foto di account? o un suo cv?
 
Ultima modifica:
ciao
1) dipende da quello che vuoi fare
2) tu, dai un occhio a
https://www.mrw.it/apache/guide/guida-apache/
3) controlli essenziali
4) serve per leggere l'estenzione del file, esempio
PHP:
<?php
//......
$tipo=array('jpg','gif','png');//e/o altre estenzioni che ti interessano
    $estensione=strtolower(pathinfo($nome_file, PATHINFO_EXTENSION)); //metto tutto a minuscolo es JPG -> jpg
    //verifico che l'estensione sia tra i tipi ammessi
    if(in_array($estensione,$tipo)){
        echo "file ammesso";
        //e quello che devi fare
    }else{
        echo "file NON ammesso";
        //e rimandi dove vuoi senza es. caricare
    }
//.....
?>
5) si o anche per farti inviare un'email con allegato
 
Ciao Borgo Italia
grazie mille per avermi risposto

1)poichè sto studiando non so che cosa voglio fare e nemmeno ho idea, vorrei chiederti cosa si fa?
anche per questo ho fatto la domanda 5) .
so soltanto che nella cartella non ci devono entrare file .exe quindi eseguibili che possono essere dannosi.
Cosa si fa più? i permessi di scrittura come si devono settare? solo quelli di scrittura o tutti e quindi 777??

Poi immagino che la cartella non debba essere raggiunta da tutti, ma solo dal proprietario del sito, e gli utenti possono vedere ciò che loro hanno inviato, ed al massimo modificarlo/eliminarlo.
Giusto?


3) per i controlli essenziali ho visto il tuo codice e mi sembra che l'ho capito bene
io ho fatto questo tipo di controllo, senza usare la funzione
pathinfo($nome_file, PATHINFO_EXTENSION)
può andare bene cmq?

PHP:
$nomefile_tmp=$_FILES["allegato"]["tmp_name"];
$tipoallegato=$_FILES["allegato"]["type"];
$nomeallegato=$_FILES["allegato"]["name"]; //nome dell'allegato completo di estensione
$dimallegato=$_FILES["allegato"]["size"];//dimensione dell'allegato
if ($dimallegato > 5)
 echo "Spiacente, ma il file è troppo grande.";
exit;}

 if($tipoallegato != "jpg" && $tipoallegato!= "png" &&
$tipoallegato != "jpeg"    &&  $tipoallegato != "gif" ) {

  echo "spiacente, only JPG, JPEG, PNG & GIF files are allowed.";
          exit;}


5) per fare l'invio di mail, devo allora aggiungere a questo tipo di file anche quello per l'invio delle mail, giusto?
 
ciao
un metodo vale l'altro
se vuoi farti inviare un'email sì, devi aggiungere la parte di codice per l'invio, ti convieve dare un occhio a
https://www.mrw.it/php/inviare-email-classe-phpmailer_7047.html
soprattutto se vuoi inviare allegati e/o email in formato html, la funzione nativa php spesso da problemi
poi per fare in modo che l'utente veda/modifichi/elimini solo il suo devi fare delle pagine riservate e un sistema di log e usare mysql
certo se vuoi che l'utente possa caricare ecc.. la cartella deve avere tutti i permessi
 
Per le mail ci penso in un secondo momento...lo vedo complicato
ma vorrei almeno ragionarci su per ora:
per il fatto che l'utente "veda/modifichi/elimini solo il suo devi fare delle pagine riservate e un sistema di log e usare mysql"
quale è il ragionamento?: quando l'utente memorizza qualcosa nel db tramite questo modulo di memorizzazione della cartella e nel db dovrebbe essere spedita all'utente una mail con un proprio Id (che deve essere l'id di inserimento nel db, giusto?) oppure una password .

Ma come la si crea la passowrd? la faccio inserire all'utente stesso in un modulo input?

tramite questo id della riga del db e la password, creo poi un form di inserimento dati per l'autenticazione dell'utente.
Questo accederà ad un programma php, che preleva dai dati digitati dall'utente , l'id e la password memorizzato nel db e fa vedere all'utente proprio quella sua riga di memorizzazione, quindi ad esempio l'immagine , o altri suoi dati?
 
Buongiorno ragazzi.
Mi aggancio anch'io a questa discussione per problematiche simili.
Dunque, sto creando una pagina con il form per l'upload di file sul mio sito.
L'upload dovrebbe poter accettare (e verificare) solamente queste estensioni:

.JPG, .JPEG, .PNG, .GIF
poi anche questi...
.dwg, .dxf, .igs, .iges, .stl .3dm .3dmf

Ho il codice php che funziona correttamente, ma per il momento accetta solo le prime 4 estensioni citate. Per aggiungere le altre 7 estensioni non ho idea di come proseguire. Ho fatto alcune prove, ma senza riuscirci.
Vi posto il codice che momentaneamente sto utilizzando, se qualcuno può darmi una mano gliene sarei molto grato.
Grazie a tutti!
PHP:
<?php
$target_dir = "models/";
$target_file = $target_dir . basename($_FILES["fileToUpload"]["name"]);
$uploadOk = 1;
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
// 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;
    }
}
// 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;
}
// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "<br>Solo i files di tipo JPG, JPEG, PNG & GIF possono essere caricati.<br>";
    $uploadOk = 0;
}
// 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 duranto l'invio del tuo file.";
    }
}
?>
 
ciao
prova a sostituire queste righe
PHP:
<?php
//...
$imageFileType = pathinfo($target_file,PATHINFO_EXTENSION);
//....
// Allow certain file formats
if($imageFileType != "jpg" && $imageFileType != "png" && $imageFileType != "jpeg"
&& $imageFileType != "gif" ) {
    echo "<br>Solo i files di tipo JPG, JPEG, PNG & GIF possono essere caricati.<br>";
    $uploadOk = 0;
}
//....
?>
con queste
PHP:
<?php
//......
$imageFileType = strtolower(pathinfo($_FILES["fileToUpload"]["name"],PATHINFO_EXTENSION));//in modo che sia sempre tutto minuscolo
//....
// Allow certain file formats
$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($estensione,$imageFileType)){//l'estenzione non è nell'arrai
    echo "<br>Solo i files di tipo JPG, JPEG, PNG & GIF...... possono essere caricati.<br>";//se vuoi elencarli oppure
    //echo "<br>non è ammesso caricare file tipo $imageFileType.<br>";
    $uploadOk = 0;//file NON consentito
}
//.....
?>
usando l'array e in_array è più comodo che fare una sfilza di condizioni nell'if
 
Grazie Borgo Italia.
Sto provando la soluzione che mia hai suggerito, ma quando lo testo, mi restituisce questo errore:
Error displaying the error page: Call to undefined method JDocumentRaw::addFavicon(): View not found [name, type, prefix]: article, php, contentView
Non capisco cosa mi sta dicendo!
 
ciao
ti dirò che non capisco quell'errore non l'ho mai visto, stai usando la programmazione ad oggetti?
perchè sembra riferirisi a un metodo di qualche classe che non è definito.
non ti riporta il numero di riga dove avviene l'errore?
 
Scusa, ma non dipende dal codice per l'upload, è un problema relativo al CMS che sto usando.
Vedo di sistemare prima quello, poi riprovo.
Scusa ancora
 
Ok, lo sto provando direttamente tramite un form puro in html ma quando invio il file da caricare ottengo quasi tutti gli errori sui vari controlli.

ERRORE:
Il nome scelto per il file esiste già. Rinomina il tuo file!

Solo i files di tipo JPG, JPEG, PNG, GIF, DWG, DXF, IGS, IGES, STL, 3DM, 3DMF possono essere caricati.

Spiacente, il tuo file non è stato caricato!
Verifica e correggi gli errori elencati e riprova.

e non invia nessun file.
Gli stessi errori si visualizzano anche se non seleziono alun file e premo semplicemente il pulsante di invio.
 
Allora, provando e riprovando, sono al punto di partenza.
Con il codice che hai postato, se tento di caricare esempio un file .stl mi dice che il tipo di file non è corretto e non me lo carica anche se è contenuto in array, mentre se tento di caricare un file di tipo immagine esempio un .jpg, mi dice che il file è del tipo corretto ma sotto mi elenca comunque il tipi di estensioni accettate e sotto ancora mi dice che non lo ha caricato e di fatto non lo carica.
 
Ho notato che nella riga:
PHP:
if(!in_array($estensione,$imageFileType)){//l'estenzione non è nell'arrai
nel (!in_array vedo un "!" che non credo vada meso (correggimi se sbaglio).
L'ho tolto ed ora l'invio funziona, però accetta solo i file che contengono immagini .jpg, .png ecc.
Se tento di caricare ad esempio un .stl mi dice che non è del tipo accettato.
 
Una curiosità...
sempre nel "in_array" c'è $estensione.
A cosa si riferisce?
 
ciao
intanto scusa un errore di copy/paste
if(!in_array($tipo,$imageFileType)){//l'estenzione non è nell'arrai
poi il ! serve vuol dire che l'estenzione che è in $imageFileType NON esiste nell'array $tipo
 
L'avevo intuito, infatti ho provato a cambiarlo appunto in $tipo, però non mi invia comunque i file se lascio il punto esclamativo
 
ciao
metti un var_dump per verificare cosa ti riporta $imageFileType
PHP:
//......
$imageFileType = strtolower(pathinfo($_FILES["fileToUpload"]["name"],PATHINFO_EXTENSION));//in modo che sia sempre tutto minuscolo
var_dump($imageFileType);
//....
esempio se provi a caricare un file es pinco_pallo.jpg il var_dump dovrebbe restituirti
string(3) "jpg"
se caricando pinco_pallo.jpg ti restituisce qualcos'altro l'errore è a monte
allora conviene verificare il valore trasmesso con un altro var_dump
PHP:
//......
var_dump($_FILES["fileToUpload"]["name"]);
$imageFileType = strtolower(pathinfo($_FILES["fileToUpload"]["name"],PATHINFO_EXTENSION));//in modo che sia sempre tutto minuscolo
//....
r risalire indietro sino a he non si trova dove si genera l'errore
 
ciao
scusa, ma evidentemente in questi giorni ho la testa in palla :-(
correggi l'if
PHP:
if(!in_array($imageFileType,$tipo){
cioe cambia posto alle due variabili
 

Discussioni simili