ho il sospetto che, a parte il metodo di verifica dell'estensione che hai già menzionato, non ci sarà modo di cogliere ogni possibile caso. I file eseguibili sono in definitiva sequenze di istruzioni della macchina che li rendono in gran parte indistinguibili da qualsiasi altro dato.
Nonostante ciò, tuttavia, è possibile cercare determinati tipi di di eseguibile. Per esempio:
- Windows utilizza il formato Portable Executable, che dovrebbe sempre iniziare con la magia numero
4d5a
(caratteri ASCII MZ
) eseguibile
- ELF formato utilizzato da Linux iniziare con
7f454c46
- Java class files iniziano sempre con
cafebabe
(è esadecimale, non ASCII!).
- Per quanto posso vedere, i file di Mach-O utilizzate da Mac-OSX hanno il magico numero di
feedface
(hex di nuovo)
Vi suggerisco di creare un FileInputStream
o simili e leggere i primi byte del file, controllando questi numeri magici. Non rileva alcun file che contenga codice eseguibile, ma dovrebbe impedire l'autorizzazione dei file in questi formati eseguibili standard, che credo sia ciò che speravi.
Così, per esempio:
public static boolean isExecutable(File file) {
byte[] firstBytes = new byte[4];
try {
FileInputStream input = new FileInputStream(file);
input.read(firstBytes);
// Check for Windows executable
if (firstBytes[0] == 0x4d && firstBytes[1] == 0x5a) {
return true;
}
return false;
}
catch (Exception e) {
e.printStackTrace();
}
}
attenzione, inoltre, che è possibile ottenere un falso positivo, in cui si rifiuta un file che non era eseguibile. Non so quale tipo di file si intende caricare, quindi è necessario considerare la probabilità che ciò accada.
Altri suggerimenti? – Rajeev