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

  • Автор темы Автор темы Fidget
  • Дата начала Дата начала

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;
}

В чем тут проблемма?
 
А если я просто залью .php файл с расширением .mp3, что произойдет?
 
Fidget
Тебе .des. показал пример, когда это возможно. В имени файла может быть больше одной точки - соответственно, расширение может быть не только вторым элементом массива.
 
В моем случае это ни так...

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

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

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

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

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

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

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

понятия не имею как его можно обойти...
 
Это только один шаг алгоритма и представлен он более чем схематично. А что дальше? Как используется переменная $error?
 
PHP:
if (filesize($filename) > $max_size) {
       $error = 'Ошибка!!!';
} elseif (!in_array($ext[1], $valid_types)) {
       $error = 'Ошибка!!!';
else {
       Upload'дится файл.

Переменная $error нужна, чтобы вывести слово Ошибка!!!
 
Попробуй в запросе, где отправляется файл написать что-то типа
site.ru/upload.php?valid_types[4]=php
 
чушь, нельзя его "извне" дополнить.

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

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