Безопасная загрузка файлов и проверка их - PullRequest
4 голосов
/ 10 июля 2011

Я получаю видео и изображения:

Мое окружение: LAMP

РЕДАКТИРОВАТЬ: Я разрешу удаленную загрузку и POST загрузка видео

РЕДАКТИРОВАТЬ2: Файлы, которые я получаю, будут переименованы, я не буду хранить оригинальные имена файлов.

  1. Сначала я проверю $_FILES тип пантомимы.

  2. Во-вторых, я проверяю с помощью finfo_file (если функция существует) снова mimetype (PHP 5.3) или с командным файлом оболочки.

  3. Файл перемещается в общедоступный каталог, если он прошел вышеуказанные проверки.

Мой вопрос, безопасна ли эта установка? Или я могу что-то улучшить? Я читал вчерашний день, мне кажется, этого достаточно, но кто знает:)

Я новичок, когда дело доходит до кодирования и безопасности: -)

Ответы [ 2 ]

1 голос
/ 11 июля 2011

до тех пор, пока вы переименовываетесь с собственным именем и расширением файла и не имеете уязвимостей типа include в коде своих приложений (например, include ($ _ GET ['what']);), это довольно хорошо.вы также захотите убедиться, что все в вашем стеке серверов является самой последней версией (особенно в том, что обрабатывает изображения / видео).

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

1 голос
/ 10 июля 2011

Я также могу порекомендовать следующее:

  1. is_uploaded_file Возвращает TRUE, если файл с именем filename был загружен через HTTP POST.Это полезно, чтобы гарантировать, что злоумышленник не попытался заставить скрипт работать с файлами, над которыми он не должен работать - например, /etc/passwd. Такая проверка особенно важна, если естьвероятность того, что все, что сделано с загруженными файлами, может раскрыть их содержимое пользователю или даже другим пользователям в той же системе.

  2. basename() функция для получения только имени файла, такого как basename(c:/fakepath/something.avi); // will return something.avi поскольку некоторые люди пытаются обмануть компьютер, давая имена файлов, похожие на каталоги.

Подробнее о basename():

При загрузкефайл, вы хотите переместить файл в каталог, который вы хотите, например, в папку /uploads/, но злонамеренный пользователь может назвать файл, например, something/hello.jpg, а затем при перемещении файла с помощью move_uploaded_file($source,$destionation) ваш $destinationбудет /uploads/something/hello.jpg, и это вызывает проблемы.Чтобы убедиться, что вы получили только правильное имя файла, вам нужно использовать функцию basename(), которая возвращает hello.jpg и т. Д.

$file_name = basename($_FILES["upload_ctrl"]["name"]);
if(!move_uploaded_file($_FILES["upload_ctrl"]["tmp_name"],"uploads/".$file_name))
    echo "Opps I cannot upload the file";

Для использования basename посетите страницу: http://php.net/manual/en/function.basename.php

...