100% безопасный скрипт загрузки фотографий - PullRequest
2 голосов
/ 25 июня 2010

Вопрос прост.Как сделать скрипт загрузки фотографий на 100% безопасным с помощью php?Есть ли учебники, которые показывают все возможные пробелы в безопасности?

Не предлагайте мне взглянуть на этот вопрос , потому что там они говорят только о размере.Но я хочу быть уверен, что никто не может загружать оболочки и другие вещи.Потому что это большой веб-сайт, который нуждается в 100% -ом безопасном сценарии загрузки фотографий.

Редактировать: или, может быть, я должен позволить членам загружать фотографии в розетки, например, imageshack, и копировать их ссылку на мой сайт?Я думаю, это на 100% безопасно, верно?

Ответы [ 3 ]

4 голосов
/ 25 июня 2010

Вещи, которые вы должны учитывать и остерегаться:

Расширения файлов: Веб-серверы используют расширение файлов для определения MIME-типа, отправляемого клиенту. Вы должны использовать белый список расширений, которые вы разрешаете. В вашем случае это будут расширения изображений.

LFI: Как уже упоминалось в Matchu, включение локального файла может быть проблемой. Если ваше приложение имеет динамические включения, которые позволяют вам включать произвольный файл, например. include($_GET['myfile']); это может привести к произвольному выполнению PHP. Таким образом, вам необходимо защитить такие включения, используя basename () . Это может даже случиться с изображениями, поскольку они могут содержать встроенные комментарии.

MIME-Type-Detection: На самом деле это не очень хорошо известно, и о нем мало информации. IE <8 имеет функцию под названием MIME-Type-Detection, которая, если Content-Type не совпадает с контентом, попытается угадать тип, просматривая первые 256 байтов. Это означает, что если у вас есть файл PNG с именем image.gif с комментарием вверху, который читает <code><script>alert('hello');</script>, то IE <8 будет считать, что это HTML, и выполнить JavaScript, что приведет к атаке XSS. </p>

Чтобы предотвратить эту проблему для изображений, вы можете использовать подход, упомянутый Williham Totland. Я бы предложил использовать getimagesize () , чтобы определить, является ли изображение действительным, и убедиться, что расширение соответствует типу.

$image_filename = 'uploaded_image.gif';
$image_extension = substr(strrchr($image_filename, '.'), 1);

$mime_mapping = array('png' => 'image/png', 'gif' => 'image/gif', 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg');
$info = getimagesize($image_filename);

if (!$info) {
    exit('not an image');
}

if ($info['mime'] != $mime_mapping[$image_extension]) {
    exit('wrong extension given');
}

// all checks passed
// image can be saved now

Об этой проблеме написана статья здесь .

4 голосов
/ 25 июня 2010

Это действительно довольно просто. Запустите все загруженные изображения через фильтр изображений, который, как известно, является безопасным. Если он ответит «Не ошибка изображения», у вас есть махинации. (Простым примером может служить преобразование идентификаторов или методика нормализации качества JPEG.) Важным моментом tho 'является фактическое использование результатов фильтра, а не исходного файла.

2 голосов
/ 25 июня 2010

Как вы упомянули, есть еще один вопрос, касающийся проблемы . Автор отмечает, что он должен быть в безопасности, если он принимает только подлинные файлы изображений и сохраняет размер файла, что является единственным, что вы можете сделать. Проверьте расширение и тип MIME и отклоните все, что не соответствует форматам, которые вы хотите. Там все еще RFI (ну, здесь больше похоже на LFI), но пока вы не включаете файлы в случайные файлы без проверки работоспособности, вам следует идти вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...