Код (Text): if (preg_match('/\.mp3$/i', $_FILES['file']['name'])) { move_uploaded_file($_FILES['file']['tmp_name'], './dir/'.$_FILES['file']['name']); } Есть ли что-то потенциально опасное в такой вот загрузке? Если да, то что именно. Спс.
да, опасно. дело в том? что по расширению работает только винда. остальные (читай нормальные) ориентируются на содержимое файла. например на тех же зайцах есть возможность качнуть и екзешник и зип а потом просто перебить на мэрэзэ и все будет петь. сделано для обхода проксей, на которых мп3 закрыт. так вот, нормальный админ будет по mime-type'у защищаться и тогда тупая подмена расширения не сработает - для системы это будет audio/mpeg
Я так понял, что работая с картинками можно юзать getimagesize для точного определения типа (если заблуждаюсь, поправьте), а как быть с проверкой других типов файлов? Для каждого использовать свои библиотеки?
имхо, самое глупое решение. дело в том, что вы запускаете процесс соответствующей библиотеки, та считывает файл, распаковывает холст и смотрит его размеры (вроде так). при этом, если это инвалидная картинка - будет ошибка. а стандартные инструменты работы с маймтайпами читают только несколько символов из файла в соответствии с поставляемым словарем.
Да, вот для загрузки сразу нескольких файлов делал Код (Text): <?php $i = 0; while ($_FILES['image']['tmp_name'][$i]) { $type = (getimagesize($_FILES['image']['tmp_name'][$i])); if ($type['mime'] == ('image/gif'||'image/jpeg'||'image/png')): $if_load = move_uploaded_file($_FILES['image']['tmp_name'][$i], './img/'.$_FILES['image']['name'][$i]); $if_load ? print('Файл '.$_FILES['image']['name'][$i]." загружен<br />\n") : '' ; endif; $i++; } ?> <form enctype='multipart/form-data' method='POST'> <input type='file' name='image[]' multiple> <input type='submit' name='onsubmit'> </form>
Так это тот же самый тип? Я думал, что в _FILES тип поставляемый браузером, который можно подменить, а в getimagesize анализ производится библиотекой по содержанию, т.е. более железно определит. Разве нет?
я уже несколько лет не использую пыхные функции (mime_content_type) и библиотеки для работы с маймтайпами (fileinfo). оставил это утилитам ОС Код (Text): file -b --mime-type /path/to/file на хостинге достаточно unix-подобную ОС иметь и разрешить вызов программ из php. для винды кстати тоже есть портированные утилиты среди которых есть и file
не читал. всегда проверяю все данные на своей стороне и дал соответствующий совет. данным от пользователей вообще нельзя доверять.
ну и зря. мало того что вы не используете возможности которые вам дает язык, так вы еще делаете ваши скрипты зависимыми от ОС и сторонних утилит и их версий, так еще используя это в продакшн - повышаете вероятность хака, ибо выполняете в командной строке то что юзер прислал(возможно всякую гадость). +уменьшение производительности ибо переключение контекста и обмен данными с вводом-выводом... а всегото надо, правильно настроить карту Mime типов и научиться юзать fileinfo Добавлено спустя 1 минуту 20 секунд: читайте себя же выше. вы именно указали что тип лежит в _FILES, и что дополнительно определять его нет необходимости
Проверку типа можно еще произвести через pathinfo. Не рекомендую доверять браузеру))) В мимтипе, ибо браузер это пользователь. =) Это так, чтобы понятнее было!))
давайте вы не будете советовать как отремонтировать карбюратор на копейке владельцу феррари. иными словами, я против ваших заявлений ничего не имею. но много лет не использовать стандартные функции не значит что не настроена карта или не умею пользоваться библиотеками. на это есть свои причины. проблема зависимости ос надумана - я сам себе хозяин. проблема хака надумана - этим обычно новичков пугают. когда все грамотно настроено вероятность хака равна частоте желания админа все форматнуть. про производительность тож самое - у копейки конечно транспортный налог ниже, но феррари лучше звучит, а это будет главным для меня при выборе транспортного средства. в общем, предлагаю не считать человека дауном, если ваш жизненный опыт не позволяет видеть смысл использования альтернативных решений. ок?
Если через pathinfo проверять 'extension', не будет ли это равнозначным проверке расширения по регулярке?
тонировка всех стекол и желтый цвет кузова - не делает вашу копейку феррари) а советовать я буду продолжать. ибо видеть как новичкам советуют всякую херню както смешно
да, это только на уровне расширения работает с учетом психов по поводу производительности и дырявости использования утилит и рекомендации php.net не использовать mime_content_type - приведу пример использования Fileinfo Код (Text): $finfo = new finfo(FILEINFO_MIME_TYPE); $mime = $finfo->file($file_full_path); собственно все
Вопрос: зачем нужно знать о реальном типе файла? Если, например, мы хостим картинки, то для проверки картинки можно и нужно воспользоваться специфическими для изображений функциями. Нам ведь надо знать, как минимум, размерность этой картинки -- тип проверится сам в процессе ))) Если это часть админки, которая грузит плагины в виде zip и распаковывает их потом -- надо контролировать ошибки распаковки. Это и будет нужная проверка. А если нам надо просто прикреплять к сообщению вложения (любого типа), то нафиг не нужно ничего проверять. Это на совести тех, кто ведет переписку. В общем, считаю топикстартер должен конкретизировать задачу. Давайте обойдемся без сферических коней в вакууме.
Как безопасно реализовать загрузку 1) изображений 2) аудиофайлов 3) видеофайлов. Какая специфика по каждому из трех пунктов должна быть учтена?