Предполагая, что вы имеете дело только с изображениями, вы можете использовать библиотеку изображений, чтобы создавать миниатюры / постоянные размеры изображений и выбрасывать оригинал, когда вы закончите. Тогда у вас фактически есть единственная точка уязвимости: ваша библиотека изображений. Предполагая, что вы держите его в актуальном состоянии, все будет в порядке.
Пользователи не смогут загружать zip-файлы или любые другие файлы, не относящиеся к изображениям, поскольку библиотека изображений прекратит работу, если попытается изменить размер данных, не относящихся к изображениям, и вы можете просто перехватить исключение. Возможно, вы захотите сделать предварительную проверку расширения имени файла. Нет смысла отправлять файл через библиотеку изображений, если имя файла «foo.zip».
Что касается разрешений, ну ... не устанавливайте бит выполнения. Но на самом деле разрешения не помогут вам сильно защитить вас от злонамеренного ввода пользователя.
Если ваша среда программирования позволяет это делать, вы захотите выполнить некоторые из этих проверок во время загрузки. Вредоносный HTTP-клиент потенциально может отправить файл с бесконечным размером. То есть, он просто никогда не прекращает передачу случайных байтов, что приводит к атаке типа «отказ в обслуживании». Или, может быть, они просто загружают видео в качестве фотографии своего профиля. У большинства форматов файлов изображений также есть заголовок в начале. Если клиент начинает отправлять файл, который не соответствует ни одному известному заголовку изображения, вы можете прервать передачу. Но это начинает переходить в царство излишеств. Если вы не Facebook, такие вещи, вероятно, не нужны.
Редактировать
Если вы разрешаете пользователям загружать скрипты и исполняемые файлы, вы должны убедиться, что все, что загружено через эту форму, никогда не будет возвращено как что-либо, кроме application/octet-stream
. Не пытайтесь смешивать Content-Type
, когда вы имеете дело с потенциально опасными загрузками. Если вы собираетесь сказать пользователям, что им нужно беспокоиться о собственной безопасности (это то, что вы делаете, когда принимаете скрипты или исполняемые файлы), тогда все должно быть указано как application/octet-stream
, чтобы браузер не пытался его отобразить. , Вам также следует установить заголовок Content-Disposition
. Вероятно, было бы также целесообразно включить антивирусный сканер в конвейер, если вы хотите иметь дело с исполняемыми файлами. ClamAV - это сценарий с открытым исходным кодом, например.