Меры безопасности при загрузке файлов через php - PullRequest
0 голосов
/ 17 сентября 2011

У меня есть скрипт загрузки файла, который будет доступен для широкой публики (например, не закрытая рабочая среда), и я думаю о безопасности: я хочу разрешить загрузку любого файла, каждый файл будет загружен вэто собственный уникальный каталог, очевидно, я не могу контролировать, загружают ли люди вредоносные файлы, но как лучше всего обращаться с этими файлами?

Я подумал:

Удаление расширения в целом,и только при обслуживании файлов для загрузки верните им их исходное расширение (поскольку все имена и местоположения файлов будут сохранены в БД)

Создание «безопасной зоны», чтобы запретить запуск нескольких расширений в каталоге.

запрещение загрузки «небезопасных» расширений.

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

итак ... есть предложения?

Ответы [ 5 ]

4 голосов
/ 17 сентября 2011

Для надлежащей безопасности:

  1. Ограничить размер файла
  2. Никогда не сохраняйте файл, используя ЛЮБЫЕ данные, предоставленные пользователем, как часть имени файла.Отслеживайте закачки через базу данных и сохраняйте файл, используя первичный ключ соответствующей записи
  3. . Не помещайте файл в каталог, доступный через Интернет - разрешите доступ только через скрипт.Затем этот сценарий может заполнить исходное имя файла в заголовках загрузки.
  4. Где бы вы ни хранили файлы, храните их с разрешениями не для выполнения.Это означает максимум 0640 в системах Unix-ish и эквивалент в системах Windows.
  5. Загрузка дросселя, чтобы пользователи не могли заполнить вашу систему разрывами последнего синего разрыва летних блокбастеров.Ограничьте загрузку, чтобы ваш сайт не стал следующим пристанищем.
  6. Отслеживайте как можно больше данных о вашем пользователе: с минимальным идентификатором браузера и его IP-адресом.Еще лучше, потребуйте некоторую форму аутентификации / входа в систему, прежде чем позволять им где-либо РЯДОМ с разделами обработки файлов сайта.
3 голосов
/ 17 сентября 2011

Если все, что вы делаете, действуете как хранилище файлов, что вас волнует?Вы не выполняете файлы или не смотрите на них каким-либо образом, не так ли?

Расширение файла не имеет ничего общего с безопасностью файла.

Редактировать: Что бы вы на самом деле сделали, это сохранили ваше имя файла в базе данных вместе с контрольной суммой полного пути.Затем ваш сценарий передаст эту контрольную сумму, которая затем будет найдена в вашей базе данных, а затем вы как-нибудь вернете файл.Не используйте ваш веб-сервер для обслуживания файла, иначе (как вы говорите в комментариях ниже) вы можете случайно запустить загруженный файл PHP.

2 голосов
/ 17 сентября 2011

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

е:

<?php

// TODO: acl related stuff
// TODO: Map request to file name
// Send the file as an attachment
header('Content-type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . $givenFileName . '"');
readfile($realFileName);
2 голосов
/ 17 сентября 2011

Просто загрузите их за пределы корневого каталога вашего документа и предоставьте php-файл по запросу

1 голос
/ 17 сентября 2011

Я думаю, вы можете использовать эти способы, чтобы сделать его безопасным

1 - не загружать файл как его имя (это означает, что вы должны изменить имя файла, используя md5(rand().time().rand()) ;

)

2 - добавить пустую страницу в словарь для загрузки, и вы можете добавить .htaccess, чтобы отрицать все, что вы можете использовать читать

файл для показа или загрузки изображения

3 - если разрешено использовать -> вы можете переименовать словарь в другое имя, используя rename() в php

4 - проверьте размер загрузки и скройте все пути, используя @include();

5 - как @periklis говорит, что если вы можете сохранить файлы вне корня вашего документа, это поможет:)

6 - запретить эти расширения .php , .asp .pl .py .rb .htaccess после того, как вы расширили расширение файла

...