Написал скрипт загрузки фотографии на сервер, и, поскольку начитался всяких ужасов, хочу спросить: безопасен ли он или я оставил какие-либо очевидные (или не очень) дыры?
Переменная $maxSize и класс DataException определены ранее, а move_uploaded_file() идёт сразу после приведённого фрагмента. Достаточны ли эти проверки?
CODE:
if ($_FILES['foto']['error']) //Ошибка при загрузке
throw new DataException('UploadError');
if ($_FILES['foto']['size'] > $maxSize) //Слишком большой размер фотографии
throw new DataException('BigFotoSize', $_FILES['foto']['size'], $maxSize);
//Определяем тип фото и его допустимость
$fileName = strtolower($_FILES['foto']['name']); //Имя временного файла
$dotPosition = strrpos($fileName, '.'); //Позиция точки в имени
if ($dotPosition === FALSE) //Если точки нет - нет расширения, ошибка типа
throw new DataException('WrongFotoType');
$extension = substr($fileName, $dotPosition+1); //Расширения
$types = array('jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'gif' => 'image/gif', 'png' => 'image/png'); //Расширения и соответствующие MIME-типы
if (! (isSet($types[$extension]) && ($types[$extension] == $_FILES['foto']['type']))) //Если тип неверный
throw new DataException('WrongFotoType');
throw new DataException('UploadError');
if ($_FILES['foto']['size'] > $maxSize) //Слишком большой размер фотографии
throw new DataException('BigFotoSize', $_FILES['foto']['size'], $maxSize);
//Определяем тип фото и его допустимость
$fileName = strtolower($_FILES['foto']['name']); //Имя временного файла
$dotPosition = strrpos($fileName, '.'); //Позиция точки в имени
if ($dotPosition === FALSE) //Если точки нет - нет расширения, ошибка типа
throw new DataException('WrongFotoType');
$extension = substr($fileName, $dotPosition+1); //Расширения
$types = array('jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'gif' => 'image/gif', 'png' => 'image/png'); //Расширения и соответствующие MIME-типы
if (! (isSet($types[$extension]) && ($types[$extension] == $_FILES['foto']['type']))) //Если тип неверный
throw new DataException('WrongFotoType');