Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1

    [PHP] Problema upload immagini Internet Explorer

    Ciao a tutti,

    Ho un problema con l'upload di immagini usando il browser Internet Explorer, mentre con mozzilla e safari questo problema non si presenta.
    //CONTROLLO CHE TUTTE LE FOTO SIANO NEL FORMATO E DELLA GRANDEZZA DESIDERATA

    $i=1;
    $risultato_foto=true;
    while($i<=$numero_foto){
    $grand=filesize($_FILES["foto_$i"]['tmp_name']);
    if($grand<=2000000){
    if ($_FILES["foto_$i"]['type'] == "image/gif" or $_FILES["foto_$i"]['type'] == "image/jpg" or $_FILES["foto_$i"]['type'] == "image/jpeg"){
    //NON VIENE EFFETTUATA NESSUNA OPERAZIONE DI CAMBIO VALORE VARIABILE $risultato_foto
    }
    else{
    $risultato_foto=false;
    echo"La foto numero $i NON è in uno dei formati supportati.

    ";
    }
    $i=$i+1;
    }
    else{
    $risultato_foto=false;
    echo"La dimensione dell'immagine numero $i è troppo grande

    ";
    }
    }

    Il problema si verifica quando viene controllata l'estensione dell'immagine, con Internet Explorer non viene passato questo controllo e viene restituito il messaggio <<La foto numero 1 NON è in uno dei formati supportati>>.

    Ripeto che questo problema si presenta solo con Internet Explorer.

    Grazie per i futuri aiuti

  2. #2
    fatti stampare il contenuto di
    $_FILES["foto_$i"]['type']

    e vedi che ci mette dentro internet explorer ^^
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  3. #3
    $_FILES["foto_$i"]['type'] è un valore fornito dal browser, non puoi assolutamente fidarti che sia presente o corretto; devi invece controllare l'estensione del nome file uploadato, o meglio ancora, usare file_info o getid3 o mime_magic per verificare il tipo di file.

    Ciao!
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  4. #4
    Ciao,

    Intanto ringrazio entrambi per le risposte

    Dunque come da suggerimento ho scaricato lo script file_info che funzona davvero bene. Ora però ho la necessità di collegare il form di upload immagini allo script. Dato che nello script di esempio la variabile $file è quella che contine il percorso del file come faccio a dargli il percorso giusto senza incappare nel problema che avevo prima?

    Inoltre ho necessità di ciclare su questo controllo perchè non ho una singola uplodata ma più di una.

    Il controllo riguardo all'estensione sarà presumibilmente così:
    $formato= $f->getType();
    if($formato=="GIF image" OR $formato=="JPG image" or $formato=="JPEG image"){
    //OK
    }
    else{
    //ERRORE
    }

    Ripeto il problema è dargli "l'indirizzo giusto" del file uploadato.

    Grazie per al disponibilità

  5. #5
    Originariamente inviato da Shores
    $_FILES["foto_$i"]['type'] è un valore fornito dal browser, non puoi assolutamente fidarti che sia presente o corretto; devi invece controllare l'estensione del nome file uploadato, o meglio ancora, usare file_info o getid3 o mime_magic per verificare il tipo di file.

    Ciao!
    beh, anche se vero che non è presente e che non si ci può fidare, può comunque essere un mezzo per il filtraggio di file uploadati da utonti in formato non supportato

    del resto se manca il mimetype io scarterei a priori l'upload per il semplice motivo che la richiesta è malformata: in un upload il content type della richiesta è "multipart/form-data", ovvero dati dal form in più parti. Se manca il content type della "parte" relativa all'upload del file piuttosto che ai dati in post ... è un errata implementazione del protocollo e quindi la richiesta può essere scartata a priori!

    Detto questo, dato che si tratta solo di immagini, puoi usare http://www.php.net/manual/en/function.getimagesize.php che tra le varie cose ti da anche il tipo di immagine
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  6. #6
    Originariamente inviato da daniele_dll


    Detto questo, dato che si tratta solo di immagini, puoi usare http://www.php.net/manual/en/function.getimagesize.php che tra le varie cose ti da anche il tipo di immagine
    Ti ringrazio per avermi segnalato questa funzione che è veramente comoda e non la conoscevo. Comunque mi resta il dubbio di come passarli il path del file uploadato infatti userei la funzione in questo modo:

    ist($width, $height, $type, $attr) = getimagesize("img/flag.jpg");

    ma che path ci metto come argomento di getimagesize affinchè me lo riconosca anche con explorer?

    grazie a tutti ragazzi

  7. #7
    explorer è lato client, php lato server ... una volta effettuato l'upload, che avviene, è php che gestisce la situazione quinci ci va la chiave tmp_name del sotto array di $_FILES[xxxxxx]

    o, ancora meglio, prima lo sposti con move_uploaded_file, controllando che effettivamente sia stato uploadato con is_uploaded_file e poi usi quella funzione perché potresti avere dei problemi con il safe mode e l'open basedir
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  8. #8
    $_FILES["foto_$i"]['tmp_name'] è una variabile fornita da PHP, e quindi sempre corretta, ed è questa che devi passare a getimagesize, file_info o qualsiasi altra funzione tu voglia utilizzare allo scopo, anche perché il controllo di tipo devi farlo PRIMA di spostare l'immagine nella sua posizione definitiva, visto che quando lo hai fatto potresti aver sovrascritto una vecchia versione dell'immagine che andava bene con una che poi scopri non essere valida, e allora come torni alla precedente?

    Comunque daniele_dll, NON è un buon consiglio di dirgli di rifiutare un upload perché non c'è il mimetype e quindi è malformato, perché equivale a dirgli che la sua maschera di upload non supporterà nessuna versione di IE (che sono TUTTE molto ballerine in questo aspetto) e che questa è una buona idea... Ora, capiamoci, neanche a me sta simpatico IE, ma di qui a dire che te ne puoi fregare di avere la compatibilità con IE su una cosa così cruciale come gli upload...
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  9. #9
    Originariamente inviato da Shores
    Comunque daniele_dll, NON è un buon consiglio di dirgli di rifiutare un upload perché non c'è il mimetype e quindi è malformato, perché equivale a dirgli che la sua maschera di upload non supporterà nessuna versione di IE (che sono TUTTE molto ballerine in questo aspetto) e che questa è una buona idea... Ora, capiamoci, neanche a me sta simpatico IE, ma di qui a dire che te ne puoi fregare di avere la compatibilità con IE su una cosa così cruciale come gli upload...
    beh, personalmente, prima di parlare/scrivere, mi documento ... evito di dare aria alla bocca per parlare o di dare "forza alle dita" per scrivere se non sono sicuro all'85% di quello che dico.

    Dunque:
    1) Internet Explorer, OVVIAMENTE, manda il mime type, fa pure una prova in locale se non mi credi. Qui c'è l'output di un semplice var_dump di $_FILES con un file uploadato con IE8 e IE7 (è uguale) ... non ho potuto provare IE6 perché IETester esplode su Win7

    codice:
    array(5) {
      ["name"]=>
      string(12) "08032008.jpg"
      ["type"]=>
      string(11) "image/pjpeg"
      ["tmp_name"]=>
      string(74) "C:\Program Files\Apache Software Foundation\Apache2.2\php-temp\php77C5.tmp"
      ["error"]=>
      int(0)
      ["size"]=>
      int(398721)
    }
    Come puoi vedere funziona perfettamente, se leggi bene il mio primissimo consiglio è stato
    fatti stampare il contenuto di
    $_FILES["foto_$i"]['type']

    e vedi che ci mette dentro internet explorer ^^
    perché come puoi vedere tu stesso, per quest'immagine jpeg ie8 ha usato image/pjpeg.

    2) Dai un occhio ai vari RFC c'è scritto che il browser deve fare del "suo meglio" per fornire sia il nome sia il tipo di contenuto. Inoltre c'è anche scritto che se il mime type non è riconosciuto deve essere inviato un application/octet-stream. Ora, anche se opzionale, i vari browser lo mandano quindi perché non utilizzarlo? Scartare gli upload che non contengono vuol dire scartare gli upload fatti da software che non sono i browser normali (ergo quelli che utilizzano gli utenti) ovvero ridurre, anche se di poco, tutti quei software che tentano di far danno.
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  10. #10
    Senti, daniele_dll, evitiamo di essere offensivi che non ce ne è nessun bisogno: non sei l'unico a essere tecnicamente preparato, qui dentro, quindi ti prego di non usare questo tono.

    Detto questo:

    http://support.microsoft.com/kb/815455

    E' esattamente la riprova di quello che vado dicendo: IE non è affatto affidabile sul tipo mime che indica durante gli upload, quindi non ci si può basare su questo per rifiutare a priori un upload.

    Se tu gli avessi consigliato di guardare quel valore, e nel caso fosse stato vuoto, di usare altri sistemi, avrei potuto anche essere d'accordo, ma dal tuo discorso sembrava che consigliassi di rifiutare a priori un file che venisse uploadato senza mime type.

    In più, se il tuo discorso è di mantenere sicuro il sito, non è male non dimenticare che QUALSIASI cosa venga dalla client side è bene che sia considerato, in termini di sicurezza, come NEMICA FINO A PROVA CONTRARIA. Quindi, a maggior ragione non mi dovrei fidare del mime type indicato dal browser, e se il browser mi manda un file *.jpg e mi dice che è di tipo image/jpeg, beh, se ho modo, per esempio come giustamente segnalavi tu usando getimagesize, di verificare le affermazioni del browser, LO FACCIO, ed è questo a rendere più sicuro il tutto, non il mime type del browser...

    Fidarsi del mime type del browser è come aprire la porta di casa a qualcuno che al "chi è" risponde "io", lo fai solo se TU HAI RICONOSCIUTO LA VOCE, non certo perché lui ha detto "io"...

    Ciao!
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.