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($stream, 4);
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($filename, rb);
$format=$fread=($stream, 4);
fclose($stream);
return ereg("^.PDF", $format) ? 1 : 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.