Подтвердить что ты не робот

Где лучшее место для сохранения изображений с пользователей

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

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

Есть ли какая-либо рекомендация здесь или лучшая практика, где я должен хранить эти данные?

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

Ответ 2

В зависимости от ресурсов, которые вы должны реализовать, например, это очень полезно хранить все это в Amazon S3.

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

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

Ответ 3

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

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

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

Ответ 4

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

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

См. postoverflow post и см. список магических чисел

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

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

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

<httpRuntime maxRequestLength="51200" executionTimeout="3600" />

Ответ 5

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