За последние 24 часа нас посетили 22377 программистов и 998 роботов. Сейчас ищут 698 программистов ...

Является ли надёжной такая проверка загружаемого файла

Тема в разделе "PHP для новичков", создана пользователем Zar, 12 фев 2013.

  1. Zar

    Zar Активный пользователь

    С нами с:
    28 авг 2012
    Сообщения:
    52
    Симпатии:
    1
    Код (Text):
    1.  
    2. if (preg_match('/\.mp3$/i', $_FILES['file']['name']))
    3. {
    4. move_uploaded_file($_FILES['file']['tmp_name'], './dir/'.$_FILES['file']['name']);
    5. }
    Есть ли что-то потенциально опасное в такой вот загрузке?
    Если да, то что именно. Спс.
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
  3. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    да, опасно. дело в том? что по расширению работает только винда. остальные (читай нормальные) ориентируются на содержимое файла.
    например на тех же зайцах есть возможность качнуть и екзешник и зип а потом просто перебить на мэрэзэ и все будет петь. сделано для обхода проксей, на которых мп3 закрыт. так вот, нормальный админ будет по mime-type'у защищаться и тогда тупая подмена расширения не сработает - для системы это будет audio/mpeg
     
  4. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    да мимтип и только
     
  5. Zar

    Zar Активный пользователь

    С нами с:
    28 авг 2012
    Сообщения:
    52
    Симпатии:
    1
    Я так понял, что работая с картинками можно юзать getimagesize для точного определения типа (если заблуждаюсь, поправьте),
    а как быть с проверкой других типов файлов? Для каждого использовать свои библиотеки?
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    имхо, самое глупое решение. дело в том, что вы запускаете процесс соответствующей библиотеки, та считывает файл, распаковывает холст и смотрит его размеры (вроде так). при этом, если это инвалидная картинка - будет ошибка.
    а стандартные инструменты работы с маймтайпами читают только несколько символов из файла в соответствии с поставляемым словарем.
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    а можно примерчик?
     
  8. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    чего примерчик-то?
     
  9. Zar

    Zar Активный пользователь

    С нами с:
    28 авг 2012
    Сообщения:
    52
    Симпатии:
    1
    Да, вот для загрузки сразу нескольких файлов делал

    Код (Text):
    1.  
    2. <?php
    3.  
    4. $i = 0;
    5. while ($_FILES['image']['tmp_name'][$i])
    6. {
    7. $type = (getimagesize($_FILES['image']['tmp_name'][$i]));
    8. if ($type['mime'] == ('image/gif'||'image/jpeg'||'image/png')):
    9. $if_load = move_uploaded_file($_FILES['image']['tmp_name'][$i], './img/'.$_FILES['image']['name'][$i]);
    10. $if_load ? print('Файл '.$_FILES['image']['name'][$i]." загружен<br />\n") : '' ;
    11. endif;
    12. $i++;
    13. }
    14.  
    15. ?>
    16.  
    17. <form enctype='multipart/form-data' method='POST'>
    18. <input type='file' name='image[]' multiple>
    19. <input type='submit' name='onsubmit'>
    20. </form>
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    определения типа через миме и прочее. и что для этого на хостинге должно работать?
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    у вас в _FILES и без getimagesize тип поставляется. посмотрите ключи массива
     
  12. Zar

    Zar Активный пользователь

    С нами с:
    28 авг 2012
    Сообщения:
    52
    Симпатии:
    1
    Так это тот же самый тип? Я думал, что в _FILES тип поставляемый браузером, который можно подменить,
    а в getimagesize анализ производится библиотекой по содержанию, т.е. более железно определит. Разве нет?
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    я уже несколько лет не использую пыхные функции (mime_content_type) и библиотеки для работы с маймтайпами (fileinfo). оставил это утилитам ОС
    Код (Text):
    1. file -b --mime-type /path/to/file
    на хостинге достаточно unix-подобную ОС иметь и разрешить вызов программ из php. для винды кстати тоже есть портированные утилиты среди которых есть и file
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    спасибо
     
  15. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    вы документацию хоть читали, прежде чем советовать доверять типу в _FILES?)))
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    не читал. всегда проверяю все данные на своей стороне и дал соответствующий совет. данным от пользователей вообще нельзя доверять.
     
  17. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    ну и зря.
    мало того что вы не используете возможности которые вам дает язык, так вы еще делаете ваши скрипты зависимыми от ОС и сторонних утилит и их версий, так еще используя это в продакшн - повышаете вероятность хака, ибо выполняете в командной строке то что юзер прислал(возможно всякую гадость). +уменьшение производительности ибо переключение контекста и обмен данными с вводом-выводом...

    а всегото надо, правильно настроить карту Mime типов и научиться юзать fileinfo

    Добавлено спустя 1 минуту 20 секунд:
    читайте себя же выше. вы именно указали что тип лежит в _FILES, и что дополнительно определять его нет необходимости
     
  18. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Проверку типа можно еще произвести через pathinfo.
    Не рекомендую доверять браузеру))) В мимтипе, ибо браузер это пользователь. =) Это так, чтобы понятнее было!))
     
  19. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    давайте вы не будете советовать как отремонтировать карбюратор на копейке владельцу феррари.
    иными словами, я против ваших заявлений ничего не имею. но много лет не использовать стандартные функции не значит что не настроена карта или не умею пользоваться библиотеками. на это есть свои причины.
    проблема зависимости ос надумана - я сам себе хозяин.
    проблема хака надумана - этим обычно новичков пугают. когда все грамотно настроено вероятность хака равна частоте желания админа все форматнуть.
    про производительность тож самое - у копейки конечно транспортный налог ниже, но феррари лучше звучит, а это будет главным для меня при выборе транспортного средства.
    в общем, предлагаю не считать человека дауном, если ваш жизненный опыт не позволяет видеть смысл использования альтернативных решений. ок?
     
  20. Zar

    Zar Активный пользователь

    С нами с:
    28 авг 2012
    Сообщения:
    52
    Симпатии:
    1
    Если через pathinfo проверять 'extension', не будет ли это равнозначным проверке расширения по регулярке?
     
  21. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    тонировка всех стекол и желтый цвет кузова - не делает вашу копейку феррари)
    а советовать я буду продолжать. ибо видеть как новичкам советуют всякую херню както смешно
     
  22. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    да, это только на уровне расширения работает

    с учетом психов по поводу производительности и дырявости использования утилит и рекомендации php.net не использовать mime_content_type - приведу пример использования Fileinfo
    Код (Text):
    1. $finfo = new finfo(FILEINFO_MIME_TYPE);
    2. $mime = $finfo->file($file_full_path);
    собственно все
     
  23. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    при каждом запросе вызывать CLI - это конечно путь гуру )
     
  24. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Вопрос: зачем нужно знать о реальном типе файла?

    Если, например, мы хостим картинки, то для проверки картинки можно и нужно воспользоваться специфическими для изображений функциями. Нам ведь надо знать, как минимум, размерность этой картинки -- тип проверится сам в процессе )))

    Если это часть админки, которая грузит плагины в виде zip и распаковывает их потом -- надо контролировать ошибки распаковки. Это и будет нужная проверка.

    А если нам надо просто прикреплять к сообщению вложения (любого типа), то нафиг не нужно ничего проверять. Это на совести тех, кто ведет переписку.

    В общем, считаю топикстартер должен конкретизировать задачу. Давайте обойдемся без сферических коней в вакууме.
     
  25. Zar

    Zar Активный пользователь

    С нами с:
    28 авг 2012
    Сообщения:
    52
    Симпатии:
    1
    Как безопасно реализовать загрузку 1) изображений 2) аудиофайлов 3) видеофайлов.
    Какая специфика по каждому из трех пунктов должна быть учтена?