Sahen
@Sahen
ох уж это программирование.....

Как сделать абсолютно безопасную загрузку файлов на сервер?

очень долго ковыряюсь с темой безопасности загрузки изображений от клиента на сервер, и у меня сложилось впечатление что сделать это "не дыряво"(полностью безопасно) на ПХП не реально в принципе.
вернее это на столько проблематично и "многогранно", что скорее всего где-то таки останется дыра для вредоносного кода.
суть вопроса вот в чем - как сделать/организовать ПОЛНОСТЬЮ безопасную загрузку и хранение:
1. изображений
2. аудио
3. видео
4. текстовых
документов на сервер от клиента?
распишите конкретно по пунктам плз.
  • Вопрос задан
  • 1040 просмотров
Пригласить эксперта
Ответы на вопрос 3
Recosh
@Recosh
Программист студент
Мне кажется запрет отдавать контент напрямую вебсерверу из каталога с пользовательскими файлами и использования проксирования с заголовком download на php должно решить проблему.
Ответ написан
Комментировать
@4iloveg
Full-Stack HTML Developer
И в чем собственно проблема? Заливаешь файл смотришь его тип, есть стандартные функции в php. Запрещаешь то что не в твоем списке.
Ответ написан
Acuna
@Acuna
Заполнил свой профиль
Что за предрассудки касаемо PHP? Ну реально, аж задело как-то даже. Если криворукая школота клепает на нем сайтики игровых кланов, которые через пять минут взламывают их такие же криворукие обиженные дружки - стоит ли винить в этом PHP? Всякие музыкальные файлопомойки же позволяют грузить файлы всем и вся, никто же их не ломает. Они же на С++ же написаны.

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

Предварительно проверяйте все по банальному разрешению, просто берете его из имени файла и через in_array () проверяете наличие в массиве предварительно разрешенных для загрузки на сервер. Из пути вырезаете все спец. символы, в том числе .. обязательно, чтобы было нельзя пройти на уровень выше и не загружать и потом скачивать ваши же файлы. С изображениями вообще красота: с помощью дефолтной GD'шной imageCreateFromJPEG () создаете объект. Если создать она не смогла - выкидывайте ошибку. Если совсем паранойя - можете после этого получить через imagesX ее ширину, если не смогла - то выкидываете ошибку. При ошибке временный файл просто удаляем. Теперь фишка в том, как будет невозможно получить готовый файл еще в процессе его проверки на сервере, так как его нужно для этого загрузить: добавляете рандомную строку к концу файла и кидаете его в рандомно сгенерированную папку, и даже если злоумышленник сможет узнать директорию куда грузятся ваши файлы и даже получит к ней доступ - он не сможет узнать имя своего файла для его запуска. Полные пути к файлам храним в БД. Если файлы загружены - наверное предполагается, что их будут скачивать. Отдавайте их через простенький скрипт на PHP, с прописанными в нем заголовками типов файлов и размером, он будет делать запрос в БД по id этого файла, получать полный путь к нему и отдавать его браузеру на закачку, при этом ни юзеры, ни даже вы сами не будете знать имя скачиваемого файла. Качается и качается, не все ли равно что? C остальными файлами все то же самое, с текстовыми еще проще: если они имеют расширение .txt - их браузер чисто физически не сможет выполнить. Только напрямую не отдавайте, не выворачивайте пути, отдавайте через скачку. Вот и все. Просто и эффективно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы