Проблемма при upload'е файлов

Fidget

Новичок
Проблемма при upload'е файлов

Есть скрипт добавления файлов на сервер пользователями...
Пользователю возможно добавить файл определенного типа (.mp3, .wav, .mid и др.) и размера...
Проверка разрешенного файла происходит по его расширению.

Проблемма состоит в следующем...

Какойто не хороший пользователь както-то обошел защиту и начал добавлять файлы с расширением .php...

проверка на разрешенный файл происходит следующим образом:
PHP:
$valid_types = array("mp3","wav","mid");
$ext=explode(".",$_FILES['upload_file']['name']);
if (!in_array($ext[1], $valid_types)) {
        $error;
}
В чем тут проблемма?
 

SunDrop

Помощник поисков. робота
А если я просто залью .php файл с расширением .mp3, что произойдет?
 

SelenIT

IT-лунатик :)
Fidget
Тебе .des. показал пример, когда это возможно. В имени файла может быть больше одной точки - соответственно, расширение может быть не только вторым элементом массива.
 

Fidget

Новичок
В моем случае это ни так...

меня интересует вопрос как это исправить
 

SelenIT

IT-лунатик :)
Стоп! Ты реальный код привел? На что влияет эта переменная $error, которой даже ничего не присваивается? В приведенном коде вообще, по сути, нет никакой проверки.
 

Fidget

Новичок
Да реальный...

Переменная $error выводит надпись... "Типа ошибка..."

Вот такая у меня проверка...

Может что-нибудь другое посоветуете?
 

SelenIT

IT-лунатик :)
Т.е. ей все-таки что-то присваивается, а перемещение временного файла происходит только в том случае, если эта переменная пуста? Тогда ничего еще...

А для самой проверки расширения - вариантов много. На мой взгляд, проще всего [m]pathinfo[/m] либо [m]strrchr[/m].
 

Fidget

Новичок
SelenIT
спасибо за pathinfo не знал про такое...

Но вот один нюанс:
если пользователь будет добавлять файл вида name.mp3.php, то он у меня на сервере сохранится в таком виде 4093.mp3 (т.е. все равно подставляется первое расширение).

А кто-то все таки добавил файлы с расширением .php
 

Fidget

Новичок
Алгоритм прелставлен выше...

понятия не имею как его можно обойти...
 

SelenIT

IT-лунатик :)
Это только один шаг алгоритма и представлен он более чем схематично. А что дальше? Как используется переменная $error?
 

Fidget

Новичок
PHP:
if (filesize($filename) > $max_size) {
       $error = 'Ошибка!!!';
} elseif (!in_array($ext[1], $valid_types)) {
       $error = 'Ошибка!!!';
else {
       Upload'дится файл.
Переменная $error нужна, чтобы вывести слово Ошибка!!!
 

yppu

Guest
Попробуй в запросе, где отправляется файл написать что-то типа
site.ru/upload.php?valid_types[4]=php
 

BRat

o_0
чушь, нельзя его "извне" дополнить.

если тебе действительно кто-то заливает php файлы на сервер не используя способ .des. и ты уверен в том что твой алгоритм проверки вообще запускается, то лучше тебе поменять реквизиты на фтп , ибо других возможностей заливать файлы я в таком случае не вижу.
 

Fidget

Новичок
BRat
Заливают пхп скрипт phpRemoteView.

Где явно видно, что они с помощью него хотят получить доступ к фтп...
 
Сверху