FileUpload::validateExtension
- dmajda
- Člen | 22
Jod napsal(a):
Je tam php validácia podľa mimetype
Vím. Kontrola probíhající přes
HTTPUploadedFile::getContentType
je sice zdánlivě
skoro neprůstřelná, ale v praxi jsem se setkal s tím, že na serveru
nebylo nainstalováno rozšíření fileinfo
a fce
mime_content_type
neexistovala. V tom případě se ve zmíněné
metodě spoléhá na to, co pošle v hlavičkách prohlížeč. To je ale
závislé na konfiguraci klientského počítače, která je v nezanedbatelném
množství případů rozbitá a zaslaný MIME typ je nesmyslný. Z těchto
důvodů nemůžu kontrolu MIME typu vždy použít.
Kontrola přípony sice nezabrání uploadu nebezpečného obsahu, ale minimálně ho neumožní nahrát pod nebezpečnou příponou (uživatel na server nedostane třeba .php soubor, který pak lze interpretovat pouhým zadáním jeho adresy) a také upozorní uživatele v případě, že se uklikne a omylem bude uploadovat úplně jiný soubor, než chtěl.
- David Grudl
- Nette Core | 8218
Co říkáte na tuto úpravu?
/* @var array */
public static $mimeTypes = array(
'doc' => 'application/msword',
'ogg' => 'application/ogg',
'pdf' => 'application/pdf',
'mov' => 'video/quicktime',
... atd
'avi' => 'video/x-msvideo',
);
public function getContentType()
{
if ($this->isOk() && $this->realType === NULL) {
if (extension_loaded('fileinfo')) {
$this->realType = finfo_file(finfo_open(FILEINFO_MIME), $this->tmpName);
} elseif (function_exists('mime_content_type')) {
$this->realType = mime_content_type($this->tmpName);
} else { // tato část je upravená
$info = getImageSize($this->tmpName);
if (isset($info['mime'])) {
$this->realType = $info['mime'];
} else {
$ext = strtolower(pathinfo($this->name, PATHINFO_EXTENSION));
$this->realType = isset(self::$mimeTypes[$ext]) ? self::$mimeTypes[$ext] : 'application/octet-stream';
}
}
}
return $this->realType;
}
Otázkou je, jestli v tom posledním kroku zvolit ‚application/octet-stream‘ nebo type posílaný prohlížečem.
Jinak Fileinfo by mělo být nativní součástí PHP od verze 5.3 a ta má vyjít v již tomto desetiletí :-)