Здравствуйте! У меня из флеш-ролика отправляется wav файл в таком виде: идет указание Content-type и дальше - содержимое файла. Как принять его и сохранить на сервере? Уже голову сломал. Пробовал всякое в заголовки подставлять и Content-type : audio/vnd.wave и Content-Disposition : form-data; filename=voice и прочее... нет, глобальный массив $_FILES не видит его(( а ведь мне этот файл надо сохранить на сервере
нет, дело, конечно же, не в кодировке. допер сам. поймал содержимое файла в PHP: $HTTP_RAW_POST_DATA а потом сохранил его вот так: PHP: file_put_contents("voice.wav", $HTTP_RAW_POST_DATA); не знаю, насколько это правильно и корректно, но пока других вариантов не вижу, а этот вариант работает
насчет безопасности, принял следующие меры: В каталоге загрузки запретил любые файлы, кроме wav и убрал обработчики исполняемых скриптов через .htaccess И сделал проверку на размер (не больше 970 Кб) Почитал, еще что-то про инъекцию нулевого байта говорят, но с ним я как-то не очень разобрался, если поставить его отфильтровку - аудио перестает работать. Как думаете, этих мер безопасности будет достаточно?
@igordata сделать проверку wav файла на валидность ? Еще думал сделать сверку по контрольным суммам файла, но не придумал, как это реализовать.
валидностью можно подтереться https://medium.com/@igordata/php-ru...execution-of-user-uploaded-files-6ff021897389 с чем сверять собрался? с тем, что было у юзера перед отправкой? что тебе это даст? только понимание того, что пришло именно то, что отправляли. короче всё просто. чтобы защититься, нужно понимать не от чего защищаешься, а что защищаешь и к чему это уязвимо. А только потом переходить к мерам защиты. Т.е. сначала скажи, что ты защищаешь. Если это просто "запретить запуск php в загруженных юзером файлах" то это одно. Если это "запретить запуск чего бы то ни было на сервере в загруженных юзером файлах" это другое. Запретить скачивать юзерам не свои файлы - это третий подход. что надо защитить?
@igordata ну, файл должен быть доступен всем посетителям для просмотра и скачивания. нужно защититься от того, чтобы в этот файл не подсунули какой-нибудь эксплоит, вирус, исполняемый скрипт или что-то подобное, что могло бы создать угрозу безопасности для сервера и других пользователей, которые будут обращаться к этому файлу
слишком размыто. если нужен гарантированный результат, то надо грузить на отдельный сервак, на котором тупо nginx отдаёт статику. если хочешь хранить там же, где и пхп, то надо защититься от двух вещей: от запуска пхп кода и от запуска файлов на исполнение в системе. первое возможно в случае, если как-то можно запросить такую страницу по такому адресу или компонент страницы так, что заюзается файл из папки загрузок. второе возможно, если твой код или какой-то код на твоём сервере может что-то запускать, а путь не проверяется. в обоих случаях нужно проверять путь через те функции, что я упомянул в статье. как вариант, можно заюзать фрейморк, который уже делает это всё сам.
@igordata Так сервер будет защищен, да. Но ведь это не защищает от встраивания стороннего кода в wav файл, например, кода вируса. Тогда пользователи могут подвергнуться опасности заражения, так ведь? А как сделать защиту от такого - не могу придумать((
@igordata ну, а почему бы и нет? Я сам сталкивался с таким, кода винлокеры встраивали в звуковые файлы.
@igordata разве нельзя как-нибудь организовать проверку файла и отклонять его загрузку, если там что-то содержится помимо звука?
@igordata нет, содержимое, конечно, нужно сначала получить ведь на сервер идет сразу содержимое файла в байт коде. нужно проверить его, если все в порядке - сохранить файл на сервере, если не в порядке - отказать в сохранении. или - сохранить файл на сервере в безопасную папку, потом проверить его, если все в порядке - сделать доступным пользователям, если нет - удалить файл. я в данный момент так делаю для проверки длительности звукового файла PHP: if(file_put_contents($upload_dir."voice.wav", $file_tmp)){ $test_wav = wavDur(ROOT_DIR."/voice.wav"); if(!$test_wav OR $test_wav > 10 OR $test_wav < 1){ unlink(ROOT_DIR."/voice.wav"); die('Error'); } die("/uploads/voice.wav"); } else die('Error');
@aprofen, вот один из вариантов, если на сервере установлен антивирус (в данном случае ClamAV) Спойлер