FileUpload::validateExtension

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
dmajda
Člen | 22
+
0
-

Ve třídě FileUpload by se hodila metoda validateExtension, která by uměla ověřit, jestli má uploadovaný soubor některou ze specifikovaných přípon. Byť tento validátor nezaručí bezpečnost, může alespoň zabránit uživateli dělat hloupé chyby.

Jod
Člen | 701
+
0
-

Je tam php validácia podľa mimetype

<?php
$form->addFile('image', 'Obrázok')
	->addCondition(Form::FILLED)
		->addRule(Form::MIME_TYPE, 'Súbor musí byť obrázok', 'image/*');
?>
dmajda
Člen | 22
+
0
-

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 | 8110
+
0
-

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í :-)

_Martin_
Generous Backer | 679
+
0
-

Úprava se mi líbí (a určitě to nemá nic společnýho s tím, že zrovna dělám administraci pro nahrávání souborů O:-)) – uvítám, když ji do Nette přidáš.