[PHP] upload di file in cartella e sua sicurezza

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:

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

VAik

Utente Attivo
16 Apr 2016
117
3
18
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?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

VAik

Utente Attivo
16 Apr 2016
117
3
18
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?
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
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.";
    }
}
?>
 

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 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
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
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!
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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?
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
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
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
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.
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
ciao
do di nuovo un occhio al tuo script, comunque lo spezzone di codice che ti ho postato funziona lo uso da tempo nel mio sito.
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
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.
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
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.
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
Una curiosità...
sempre nel "in_array" c'è $estensione.
A cosa si riferisce?
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

xnotar

Utente Attivo
3 Apr 2012
65
0
6
L'avevo intuito, infatti ho provato a cambiarlo appunto in $tipo, però non mi invia comunque i file se lascio il punto esclamativo
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
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