2013-07-28 2 views
1

Я создаю сайт с использованием ASP.NET MVC4, одна из функций на сайте - это загрузка изображений пользователями. Изображения могут носить личный характер, почти определенно содержащие образы своих детей.Предотвращение доступа пользователей к содержимому каталога изображений

Изображения хранятся в базе данных MS Azure SQL вместе с их метаданными. Чтобы сохранить использование полосы пропускания на лазури, когда изображение было загружено, он сохраняет в каталог пользователя

~/UserImages/<Username>/<Image>

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

<Username> часть каталога создается контроллером, когда требуется, поэтому я не могу установить на него разрешение IIS. Однако, даже если бы я был, я не уверен, что IIS может делать, поскольку пользователи не известны заранее (новые регистрации и т. Д.).

Из-за маршрутизации MVC, пользователи не смогут получить доступ к другим каталогам пользователей, угадывая имена пользователей, однако, если вы можете угадать имя пользователя и имя, то оно отображается. Я ищу идеи по предотвращению этого, чтобы свести к минимуму вероятность того, что некоторые изображения elses станут доступны другим.

Я пробовал IgnoreRoute, но это не сработало.

routes.IgnoreRoute("UserImages/{*pathInfo}"); 

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

ответ

1

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

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

Затем вы можете предоставить доступ к этим изображениям через Controller (UserImagesController). Действие, которое может подтвердить, что запрашиваемое изображение является тем, к которому имеет доступ текущий пользователь.

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

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

+0

Вместо того, чтобы использовать виртуальный путь, сохраните их локально в другом месте, а затем скопируйте их в структуру сайта по запросу? Они должны быть приведены в структуру для IIS, чтобы обслуживать их, поэтому обратите внимание, что это устраняет проблему, если они не будут удалены сразу после ее подачи. – James

+2

@James Используйте ваш контроллер и действие FileResult для извлечения и обслуживания файлов. Действие может выполнять аутентификацию и возвращать изображения только соответствующим пользователям, таким как website.com/mypictures/1. –

+0

Точно. Нет необходимости, чтобы файл был физически внутри сайта. Если ваше приложение имеет доступ к физическому файлу, вы можете вернуть его с помощью FileResult, как сказал @JamesSantiago. –

Смежные вопросы