Проверка на тип загружаемого файла.

864
.
Решил добавить на свой сайт форму для того что бы пользователи могли загружать свои файлы... Потом они естественно будут проходить модерацию, но не это важно. Меня интересуют способы запрета заливки левых файлов типа .php .phtml и т.п. Сейчас вот у меня есть такой код:
if (substr($_FILES['filename']['type'],0,5) == 'image') 
{ move_uploaded_file($_FILES['filename']['tmp_name'], "/img/wall".$name_image.""); 
} 
else 
{ echo "Разрешена загрузка только изображений"; 
}

Короче мне нужно что бы была возможность загружать не только картинки но и другие файлы (видео, музыку)... Что думаете насчет этого кода? Безопасен ли он? Можно ли его использовать в таких целях?
И какие способы вы можете предложить? Интересны любые идеи по этой теме.
.
в оригинале же можно любые файлы загружать вроде
загружал .lis загрузился
.
Let Mortal Kombat begin
нельзя php файлы загружать.

hooligan - посмотри как на форуме в джонне это сделано. Можно еще подключить класс аплоалд.
А то что ты выбрал - ну не знаю. Не внушает доверия. Надо почитать про substr($_FILES['filename']['type'],0,5) == 'image'
.
aka Sex Terror
Лучше будет создать массив с допустимыми расширениями, затем отделить расширение от имени файла и проверить есть ли расширение в созданном массиве. если нет, то облом. а если есть то загружай. примерно так же и в джоне сделано, только там много проверок имени файла. код примерно таким будет
$ext = array('mp3', 'gif'); // и так далее...
$f = explode('.', $_FILES['file']['name']);
if (in_array($f[1], $ext))
Загружаем файл
else
Обламываем юзера

Это я так, в кратце написал для примера. а на самом деле тут еще много проверок надо делать.
.
Let Mortal Kombat begin
BupTyo3 (18.06.2011/14:14)
$f = explode('.', $_FILES['file']['name']);
А если расширение двойное или в названии несколько точек (image.png.zip, programm_version_2.23.10.exe)?
Нужно получить именно последнее расширение и сравнивать по нему
Для этого делаем array_pop()
.
Let Mortal Kombat begin
$ext = array_pop(explode(".", $filesname));
Как то так
.
Кадило крутится, лавэха мутится
Есть стандартная функция для этого
$filename = 'file.mp3.mp4.mp10.mp100';
$type = pathinfo($filename, PATHINFO_EXTENSION);
echo $type; // Выведет mp100
.
Кадило крутится, лавэха мутится
или же есть ещё вариант проверять по mime типу, но это не работает на многих хостах.
.
всем спасибо...
смотрел код форума, в принципе подойдет...
Тему прошу пока не закрывать, будут ещё вопросы...
.
Кто подскажет как это работает?
if (!class_exists(ffmpeg_movie)) 
{ 
    die('ничего не выйдет, нужна ffmpeg на хостинге'); 
}
$file = 'C:/WebServers/home/localhost/www/zaychik/files/'.$_GET['ffmpeg'];// получаем имя файла оригинальной картинки
 
if (file_exists($file)) 
{ 
    $mov = new ffmpeg_movie($file); 
} 
else 
{ 
    die('невозможно найти файл'); 
} 
 
//номер кадра 
$frame = 50; 
 
//ширина 
$w = $mov->GetFrameWidth(); 
 
//высота 
$h = $mov->GetFrameHeight(); 
 
//извлечение кадра 
$ff_frame = $mov->getFrame($frame); 
 
if ($ff_frame) 
{ 
    //в формат GD 
    $gd_image = $ff_frame->toGDImage(); 
 
if ($gd_image) 
    { 
        //вывод (для примера в gif) 
        header('Content-type: image/gif'); 
        imagegif($gd_image); 
        /*можно сделать изменение размера, нанесение копирайтов и водяных знаков, в общем все что применимо для GD*/ 
    } 
    else 
    { 
        die('невозможно преобразовать в GD'); 
    } 
} 
else 
{ 
    die('невозможно извлечь кадр'); 
}
Всего: 44