где лучшее место для сохранения изображений от загрузки пользователями - PullRequest
39 голосов
/ 27 декабря 2010

У меня есть сайт, который показывает галереи. Пользователи могут загружать свой собственный контент из Интернета (путем ввода URL-адреса) или загрузки изображения со своего компьютера.

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

Есть ли здесь какие-либо рекомендации или рекомендации относительно того, где их хранить?

Должен ли я сохранить их в папках appdata или content? Разве они не должны храниться на сайте вообще, потому что это пользовательский контент?

Ответы [ 5 ]

61 голосов
/ 27 декабря 2010

Вы НЕ должны хранить загруженные пользователем файлы везде, где к ним можно получить прямой доступ по известному URL в структуре вашего сайта. Это угроза безопасности, поскольку пользователи могут загружать файлы .htm и .js. Даже файл с правильным расширением может содержать вредоносный код, который может быть выполнен в контексте вашего сайта аутентифицированным пользователем, допускающим атаки на стороне сервера или на стороне клиента.

См., Например, http://www.acunetix.com/websitesecurity/upload-forms-threat.htm и Какие проблемы безопасности возникают, когда пользователи могут загружать свои собственные файлы? , в которых упоминаются некоторые проблемы, которые необходимо знать, прежде чем разрешить пользователям загружать файлы а затем представить их для загрузки на вашем сайте.

  1. Не помещайте файлы в обычную структуру каталогов веб-сайта

  2. Не используйте оригинальное имя файла, которое дал вам пользователь. Вы можете добавить заголовок расположения содержимого с исходным именем файла, чтобы они могли снова загрузить его с тем же именем файла, но путь и имя файла на сервере не должны быть такими, на которые пользователь может повлиять.

  3. Не доверяйте файлам изображений - измените их размер и предложите только версию с измененным размером для последующей загрузки

  4. Не доверяйте mime-типам или расширениям файлов, откройте файл и манипулируйте им, чтобы убедиться, что это то, что он утверждает.

  5. Ограничить размер загрузки и время.

8 голосов
/ 17 октября 2011

В зависимости от ресурсов, которые вам нужны для реализации чего-то подобного, чрезвычайно выгодно хранить все эти вещи в Amazon S3.

Получив выгрузку, вы просто перетаскиваете ее в Amazon и выкладываете URLв вашей базе данных, как вы делаете с другими изображениями.Как упомянуто выше, вероятно, было бы целесообразно открыть изображение и изменить его размер перед отправкой.Это одновременно проверяет, что это на самом деле изображение, и гарантирует, что вы случайно не представите конечному пользователю изображение с полным разрешением камеры.

Выполнение этого сейчас сделает его намного, намного проще, если вам когда-либо придется выполнить миграцию /переходите на другой сайт и не хотите синхронизировать гигабайты графических ресурсов.

4 голосов
/ 11 октября 2011

Один из способов - сохранить изображение в таблице базы данных с полем varbinary.

Другой способ - сохранить изображение в папке App_Data и создать подпапку для каждого пользователя (~ / App_Data /[userid] /myImage.png).

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

3 голосов
/ 16 октября 2011

При загрузке изображений вам необходимо проверить содержимое файла перед его загрузкой.Метод расширения файла не является надежным.

Используйте метод магического числа, чтобы проверить содержимое файла, что будет простым способом.

См. Сообщение stackoverflow и см. список магических чисел

Один из способов сохранить файл - преобразовать его в двоичный формат и сохранить в нашей базе данных, а следующий метод - использовать папку App_Data.

Опция храненияна основе вашего требования.См. этот пост также

Установите лимит загрузки, установив для свойства maxRequestLength значение Web.Config, например, где размер файла указан в КБ

* 1020.*
0 голосов
/ 18 октября 2011

Вы можете сохранить свои доверенные данные параллельно папке htdocs/www, чтобы любой пользователь не мог получить доступ к этой папке.Также вы можете добавить аутентификацию .htaccess к вашим доверенным данным (для .htaccess вы должны хранить ваш файл .htpasswd параллельно папке htdocs / www), если вы используете apache.

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