За последние 24 часа нас посетили 22423 программиста и 1026 роботов. Сейчас ищет 671 программист ...

Как принять такой файл на сервере?

Тема в разделе "PHP для новичков", создана пользователем aprofen, 23 апр 2018.

  1. aprofen

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

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    Здравствуйте!

    У меня из флеш-ролика отправляется wav файл в таком виде:

    [​IMG]

    идет указание Content-type и дальше - содержимое файла. Как принять его и сохранить на сервере? Уже голову сломал.

    Пробовал всякое в заголовки подставлять

    и Content-type : audio/vnd.wave

    и Content-Disposition : form-data; filename=voice

    и прочее...

    нет, глобальный массив $_FILES не видит его((

    а ведь мне этот файл надо сохранить на сервере
     
  2. FullSilence

    FullSilence Новичок

    С нами с:
    19 май 2017
    Сообщения:
    15
    Симпатии:
    0
    Адрес:
    Москва, Зеленоград
    Я не профи, но возможно дело в кодировке?
     
  3. aprofen

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

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    нет, дело, конечно же, не в кодировке.

    допер сам.

    поймал содержимое файла в

    PHP:
    1. $HTTP_RAW_POST_DATA
    а потом сохранил его вот так:

    PHP:
    1. file_put_contents("voice.wav", $HTTP_RAW_POST_DATA);
    не знаю, насколько это правильно и корректно, но пока других вариантов не вижу, а этот вариант работает
     
    acho нравится это.
  4. aprofen

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

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    насчет безопасности, принял следующие меры:

    В каталоге загрузки запретил любые файлы, кроме wav и убрал обработчики исполняемых скриптов через .htaccess

    И сделал проверку на размер (не больше 970 Кб)

    Почитал, еще что-то про инъекцию нулевого байта говорят, но с ним я как-то не очень разобрался, если поставить его отфильтровку - аудио перестает работать.

    Как думаете, этих мер безопасности будет достаточно?
     
  5. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    не, не достаточно. Это вообще не меры. Меры в другом. Завтра напишу в чем.
     
  6. aprofen

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

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @igordata сделать проверку wav файла на валидность ? Еще думал сделать сверку по контрольным суммам файла, но не придумал, как это реализовать.
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    валидностью можно подтереться https://medium.com/@igordata/php-ru...execution-of-user-uploaded-files-6ff021897389
    с чем сверять собрался? с тем, что было у юзера перед отправкой? что тебе это даст? только понимание того, что пришло именно то, что отправляли.

    короче всё просто. чтобы защититься, нужно понимать не от чего защищаешься, а что защищаешь и к чему это уязвимо. А только потом переходить к мерам защиты. Т.е. сначала скажи, что ты защищаешь. Если это просто "запретить запуск php в загруженных юзером файлах" то это одно. Если это "запретить запуск чего бы то ни было на сервере в загруженных юзером файлах" это другое. Запретить скачивать юзерам не свои файлы - это третий подход.

    что надо защитить?
     
  8. aprofen

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

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @igordata

    ну, файл должен быть доступен всем посетителям для просмотра и скачивания.

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

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    слишком размыто.
    если нужен гарантированный результат, то надо грузить на отдельный сервак, на котором тупо nginx отдаёт статику.
    если хочешь хранить там же, где и пхп, то надо защититься от двух вещей: от запуска пхп кода и от запуска файлов на исполнение в системе.

    первое возможно в случае, если как-то можно запросить такую страницу по такому адресу или компонент страницы так, что заюзается файл из папки загрузок.
    второе возможно, если твой код или какой-то код на твоём сервере может что-то запускать, а путь не проверяется.

    в обоих случаях нужно проверять путь через те функции, что я упомянул в статье.

    как вариант, можно заюзать фрейморк, который уже делает это всё сам.
     
  10. aprofen

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

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @igordata

    Так сервер будет защищен, да. Но ведь это не защищает от встраивания стороннего кода в wav файл, например, кода вируса. Тогда пользователи могут подвергнуться опасности заражения, так ведь? А как сделать защиту от такого - не могу придумать((
     
  11. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    ну это ты уже слишком далеко копаешь
     
  12. aprofen

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

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @igordata

    ну, а почему бы и нет? Я сам сталкивался с таким, кода винлокеры встраивали в звуковые файлы.
     
  13. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    антивирус на сервере это максимум того, что ты можешь сделать.
     
  14. aprofen

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

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @igordata

    разве нельзя как-нибудь организовать проверку файла и отклонять его загрузку, если там что-то содержится помимо звука?
     
  15. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    как ты можешь проверить содержимое файла до получения содержимого файла?
     
  16. aprofen

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

    С нами с:
    24 янв 2018
    Сообщения:
    71
    Симпатии:
    5
    @igordata
    нет, содержимое, конечно, нужно сначала получить
    ведь на сервер идет сразу содержимое файла в байт коде.

    нужно проверить его, если все в порядке - сохранить файл на сервере, если не в порядке - отказать в сохранении.

    или - сохранить файл на сервере в безопасную папку, потом проверить его, если все в порядке - сделать доступным пользователям, если нет - удалить файл.

    я в данный момент так делаю для проверки длительности звукового файла

    PHP:
    1. if(file_put_contents($upload_dir."voice.wav", $file_tmp)){
    2.         $test_wav = wavDur(ROOT_DIR."/voice.wav");
    3.         if(!$test_wav OR $test_wav > 10 OR $test_wav < 1){
    4.             unlink(ROOT_DIR."/voice.wav");
    5.             die('Error');
    6.         }
    7.         die("/uploads/voice.wav");
    8.     } else
    9.         die('Error');
     
    #16 aprofen, 26 апр 2018
    Последнее редактирование: 26 апр 2018
  17. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @aprofen, вот один из вариантов, если на сервере установлен антивирус (в данном случае ClamAV)
     
  18. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510