Отличный цикл статей на очень актуальную проблему.
Пракически каждый второй самописный проект с формой заливки изображения имеет подобные уязвимости, как это ни печально :(
Если у изображения будет расширение php5 или какое-то другое неучтенное в blacklist, то скрипт успешно выполнится. Имхо намного безопаснее использовать whitelist: array('gif',jpg, ...)
Файлы с расширением php5 — выполняются? Первый раз слышу. Блеклист и whitelist — оба плохих решения, лучше всего как я сказал присуждать расширение файла автоматически, на основе его проверенного типа.
Если вам нужно сделать загрузку картинок, то лучше использовать белый список расширений, если же просто загрузку аттачей, то блеклист исполняемых расширений.
tapin13, но если злоумышленник получит доступ к httpd.conf или хоты бы .htaccess, то можно считать, что безобасность сервера уже нарушена и его уже ничто не спасет. Поэтому стоит признать, что whitelist намного более безопасен.
Вообще надо сразу делать resize картинки, в итоге если бы это был скрипт — будет ошибка, если ошибка — удаляем.
Даже если будет замаскирован скрипт, то «внутренности» файла сильно изменятся и соответсвенно скрипт не сработает.
Это так сказать самый простой вариант «борьбы»
Ну и почему минус?
Аргументы можно?
Я опущу ошибки в путях сохранения файла (по умолчанию надо «разбирать» get post cookie и проверять)
При resize файл изменяется содержимое файла — если скрипт, он просто не заработает, так как тоже подвергнется видоизменениям. Если функция resize выдаст ошибку — просто удаляем файл.
ну в случае использования ffmpeg понятно — там можно тупо конвертировать файл при загрузке и вредоносный код перестает существовать.
интересно тогда знать, ну допустим подменил я mime-тип засунув пхпшный файл с раширеним .avi.
неужели его открытие в браузере вызовет исполнение php-кода?
Не совсем. Злополучный IE пытается казаться умным и может выполнить код в image/jpeg например. Но это правда уязвимости другого рода — сервер *.avi файл не будет выполнять ;)
прочитал последний абзац второй главы и нашел ответ на вторую часть вопроса.
получается единственно безопасное для видео файлов, помимо всех проверок — конвертировать их при аплоаде.
а зачем вообще использовать имя присланного файла, между прочим это тоже баг. move_uploaded_file перезапишет существующий файл с таким же именем. нужно генерить уникальное имя и цеплять к нему нужное расширение
выше описаные методы работать не будут, в случае kestas.kuliukas.com/JavaScriptImage/forumlogo2.png (Открываем в ИЕ), поэтому делаю ресайз пикчи на 1 пиксель, при желании можно потом на один пиксель увеличить, тогда JavaScript рушится.
Вопрос, а почему нельзя совсем просто поступить и допускать файлы только с расширениями из white list, не проверяя содержание? Ну и пусть внутри будет находиться вредоносный код, если файл будет с расширением .jpeg, например, то ведь всё равно ничего не выполнится?
да, но я не принимаю файлы, не прошедшие через фильтр допускаемых расширений. Конечно можно директивы .htaccess спрятать в файле под расширением .gif, и он сохранится в папке для картинок, но исполняться-то всё равно не будет? Правильна ли логика?
Как видно, переводчик PHP игнорирует двоичные данных в…
интерпритатор, компилятор, интерпретирующий компилятор, пожалуйста, не обзывайте «переводчик»
а вообще по статье хорошо, но не все. что конкретно картинок касается, то нужно работать по схеме разрешено разрешенное, а не незапрещенное, тоесть пере конвертировать картинку
Безопасная загрузка изображений на сервер. Часть первая