Решил добавить на свой сайт форму для того что бы пользователи могли загружать свои файлы... Потом они естественно будут проходить модерацию, но не это важно. Меня интересуют способы запрета заливки левых файлов типа .php .phtml и т.п. Сейчас вот у меня есть такой код:
if (substr($_FILES['filename']['type'],0,5) == 'image')
{ move_uploaded_file($_FILES['filename']['tmp_name'], "/img/wall".$name_image."");
}
else
{ echo "Разрешена загрузка только изображений";
}
Короче мне нужно что бы была возможность загружать не только картинки но и другие файлы (видео, музыку)... Что думаете насчет этого кода? Безопасен ли он? Можно ли его использовать в таких целях?
И какие способы вы можете предложить? Интересны любые идеи по этой теме.
в оригинале же можно любые файлы загружать вроде
загружал .lis загрузился
нельзя php файлы загружать.
hooligan - посмотри как на форуме в джонне это сделано. Можно еще подключить класс аплоалд.
А то что ты выбрал - ну не знаю. Не внушает доверия. Надо почитать про substr($_FILES['filename']['type'],0,5) == 'image'
Лучше будет создать массив с допустимыми расширениями, затем отделить расширение от имени файла и проверить есть ли расширение в созданном массиве. если нет, то облом. а если есть то загружай. примерно так же и в джоне сделано, только там много проверок имени файла. код примерно таким будет
$ext = array('mp3', 'gif'); // и так далее...
$f = explode('.', $_FILES['file']['name']);
if (in_array($f[1], $ext))
Загружаем файл
else
Обламываем юзера
Это я так, в кратце написал для примера. а на самом деле тут еще много проверок надо делать.
BupTyo3 (18.06.2011/14:14)
$f = explode('.', $_FILES['file']['name']);
А если расширение двойное или в названии несколько точек (image.png.zip, programm_version_2.23.10.exe)?
Нужно получить именно последнее расширение и сравнивать по нему
Для этого делаем array_pop()
$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('невозможно извлечь кадр');
}