Domanda

Sto programmando qualcosa che consente agli utenti di archiviare documenti e immagini su un server web, che possono essere memorizzati e recuperati in seguito. Quando gli utenti caricano i file sul mio server, PHP mi dice quale tipo di file è basato sull'estensione. Tuttavia, temo che gli utenti possano rinominare un file zip come somezipfile.png e archiviarlo, mantenendo così un file zip sul mio server. Esiste un modo ragionevole per aprire un file caricato e " controllare " per vedere se è veramente del tipo di file detto?

È stato utile?

Soluzione

Numero magico . Se riesci a leggere i primi byte di un file binario puoi sapere che tipo di file è.

Altri suggerimenti

Controlla FileInfo estensione PECL per PHP, che può fare il Ricerche magiche MIME per te.

Sorta di. La maggior parte dei tipi di file ha alcuni byte riservati per contrassegnarli in modo da non dover fare affidamento sull'estensione. Il sito http://wotsit.org è un'ottima risorsa per scoprirlo per un determinato tipo.

Se sei su un sistema unix, credo che il comando file non si basi sull'estensione, quindi potresti sborsarti se non vuoi scrivere il codice di controllo byte.

Per PNG ( http://www.w3.org/TR/PNG- Rationale.html )

I primi otto byte di un file PNG contengono sempre i seguenti valori:

(decimale) 137 80 78 71 13 10 26 10

(esadecimale) 89 50 4e 47 0d 0a 1a 0a

(notazione ASCII C) \ 211 P N G \ r \ n \ 032 \ n

Se hai a che fare solo con immagini, getimagesize () dovrebbe distinguere un'immagine valida da una falsa.

$ php -r 'var_dump(getimagesize("b&n.jpg"));'
array(7) {
  [0]=>
  int(200)
  [1]=>
  int(200)
  [2]=>
  int(2)
  [3]=>
  string(24) "width="200" height="200""
  ["bits"]=>
  int(8)
  ["channels"]=>
  int(3)
  ["mime"]=>
  string(10) "image/jpeg"
}

$ php -r 'var_dump(getimagesize("/etc/passwd"));'
bool(false)

Un valore falso da getimagesize non è un'immagine.

Molti tipi di file hanno " numeri magici " all'inizio del file per identificarli, puoi leggere alcuni byte dalla parte anteriore del file e confrontarli con un elenco di numeri magici noti.

Su un sistema unix, catturare l'output dal comando 'file' dovrebbe fornire informazioni adeguate.

Per una risposta esatta su come è possibile farlo rapidamente in PHP, consulta questa domanda: Come trovo il tipo mime di un file con php?

Come nota a margine ho riscontrato un problema simile in cui ho dovuto fare il mio controllo del tipo. L'interfaccia front-end alla mia applicazione è stata eseguita in flash. I file venivano passati attraverso Flash a uno script php. Quando stavo tentando di fare un controllo del tipo MIME usando php, il tipo sempre restituito era application / octetstream perché proveniva da Flash.

Ho dovuto implementare un paradigma di tipo numeri magici. Ho semplicemente creato un file xml che conteneva il tipo di file insieme ad alcuni schemi di definizione trovati all'inizio del file. Una volta che il file ha raggiunto il server ho fatto un modello corrispondente con il file XML e quindi ho accettato o rifiutato il file. Non ho notato alcuna riduzione delle prestazioni reali nemmeno quello che mi aspettavo.

Questa è solo una nota a margine a chiunque stia usando Flash come front-end e provando a digitare controlla il file una volta caricato.

Oltre a identificare il tipo di file, potresti voler fare attenzione ai file con altri file incorporati o aggiunti ad essi. Ciò richiederà purtroppo un'analisi più approfondita del contenuto del file rispetto al semplice utilizzo di "numeri magici".

Ad esempio, http://quantumrook.wordpress.com/2007/06/06/hide-a-rar-file-in-a-jpg-file/ (questo particolare tipo di nascondimento dei dati può essere facilmente risolto da caricare e salvare in un nuovo file i dati dell'immagine reale .. altri saranno più difficili.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top