Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Riconoscere un file in php

    Ciao a tutti sono nuovo di questo forum.
    Avrei subito una domanda da porvi.....

    Ho un form in php dove posso fare l'upload di file il problema è che il mio capo vuole che faccia un controllo sui tipi di file da inserire e in particolare vuole che si possano inserire solo i .exe .dd .pdf

    Come posso fare un controllo sul tipo di file da inserire?

    Grazie a tutti spero mi aiutate....

  2. #2
    Utente di HTML.it L'avatar di Il_Drugo
    Registrato dal
    May 2006
    Messaggi
    1,220
    Codice PHP:

    $nome_file 
    $_FILES['upfile']['name'];

    $ext array_pop(explode("."$nome_file));

    if(
    $ext == "exe" || $ext == "dd" || $ext == "pdf")
    {
        
    // uploadi il file
    }
    else
    {
        
    // printi un messaggio di errore


  3. #3
    Ehi Drugo ci ribecchiamo

    Mi permetto di dire che cmq, un controllo sull'estensione del file non ti garantisce il tipo del file stesso...
    Dovresti controllare il MIME-TYPE del file, che ricevi tra i vari paramentri del file stesso attraverso i FORM encrypte-data...

    Dammi un attimo e posto un esempio...
    Salvatore De Bonis AKA Novice of Ricotta AKA NashCrash

  4. #4
    Eccolo:
    Codice PHP:
    <FORM ACTION="prova.php" METHOD="POST" enctype="multipart/form-data">
    <
    INPUT TYPE="File" NAME="nuovofile">
    </
    FORM
    Poi vai a vedere il MIME che restituisce:

    Codice PHP:
    // prova.php
    echo $_FILES['nuovofile']['type']; 
    o meglio

    Codice PHP:
    // prova.php
    print_r($_FILES['nuovofile']);  // Mostra nome, size, eventuali errori,... 
    Noterai che uploadando un file eseguibile, anche se gli cambi estensione, ha lo stesso MIME...

    Cerca MIME in questo forum...
    Salvatore De Bonis AKA Novice of Ricotta AKA NashCrash

  5. #5
    Utente di HTML.it L'avatar di Il_Drugo
    Registrato dal
    May 2006
    Messaggi
    1,220
    Si verissimo. molto meglio il controllo sul MIME. L'unica limitazione è che ci sono certi formati di files (come ad esempio CREDO i .dd) che hanno un MIME non conosciuto.

    Cmq si appoggio il suggerimento di NoR.


  6. #6
    Utente di HTML.it L'avatar di gianiaz
    Registrato dal
    May 2001
    Messaggi
    8,027
    Mi spiace dare torto a entrambi, ma il mime-type viene passato dal browser al server, ed è una stringa che volendo può essere modificata.
    In effetti non c'è sicurezza nel tipo di file inserito nell'upload.

    ciao

  7. #7
    L' unica soluzione se vuoi un controllo sicuro è quella di leggersi il file in modalità binaria.

    Ti leggi l'header e controlli se i byte dell' header corrispondono con il tipo di file.
    Ti faccio un esempio:
    I file pdf (credo sia lo standard) hanno i primi 8 byte comuni per esempio un file pdf versione 1.4 qualsiasi avrà dalla posizione 0 alla posizione 8 i seguenti valori in esadecimale:

    25 50 44 46 2d 31 2e 34

    Con un editor esadecimale puoi facilmente verificare la cosa.
    Questi byte codificati in ASCII rappresentano la stringa:
    %PDF-1.4

    quindi con un qualsiasi linguaggio di programmazione (in questo caso php) puoi aprire il file in php:
    Codice PHP:
    $stream=fopen("file.pdf"rb); 
    A questo punto ti leggi i primi 8 byte se ti interessa la versione oppure primi 4 i byte se ti interessa solo il formato. In php (supponendo che ti interessa solo il formato)
    Codice PHP:
    $format=fread($stream4); 
    Chiudi il flusso xchè non ti interessa più lavorare sul contenuto del file
    Codice PHP:
    fclose($stream); 
    e a questo punto puoi fare un confronto su $format. Se questa contiene la stringa %PDF allora il file è sicuramente un pdf.

    Quindi per concludere il codice che doveresti inserire in un ipotetica funzione che ti riconosce se un file è in formato pdf è:
    Codice PHP:
    function isPdf($filename){
         
    $stream=fopen($filenamerb);
         
    $format=$fread=($stream4);
         
    fclose($stream);

         return 
    ereg("^.PDF"$format) ? 0;

    In conclusione questo è un metodo molto sicuro per riconoscere un tipo di file, ma non è sicuro al 100% in quanto qualcuno potrebbe tranquillamente crearti un file con un header "%PDF-1.4" e poi inserire dopo l' header qualsiasi cosa. La probabiltà che questo accada è comunque bassa.
    In ogni modo con questa tecnica controlli solo che il file sia scritto nel formato da te desiderato e non ti è comunque garantito che il file che stai esaminando sia stato scritto correttamente.

    Per i file .exe e .dd di cui hai bisogno, non conosco come sono fatti, cmq puoi facilmente trovarti l'header file aprendo dei file .exe o .dd con un editor esadecimale e cercando di capire tra i primi 20 - 30 byte le uguaglianze che ci sono, a quel punto sei in grado di scriverti una funzione simile a isPdf che faccia le stesse cose per i file .exe e.dd.

  8. #8
    Grazie a tutti ragazzi.... credo che opterò per il primo script tanto non ho bisogno di particolari controlli di sicurezza cmq di nuovo grazie siete stati veramente bravi....

  9. #9
    Originariamente inviato da gianiaz
    Mi spiace dare torto a entrambi, ma il mime-type viene passato dal browser al server, ed è una stringa che volendo può essere modificata.
    In effetti non c'è sicurezza nel tipo di file inserito nell'upload.

    ciao
    E c'hai ragione, c'hai! La soluzione di Marcoski è estremamente interessante!!!

    [OT]
    Ahhh, grazie ragazzi, questo forum è bellissimo: ci trovi sempre le soluzioni migliori hai problemi più disparati!!!
    [/OT]
    Salvatore De Bonis AKA Novice of Ricotta AKA NashCrash

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.