Как защитить загруженные пользователем файлы

#asp.net-mvc #security #architecture #file-upload

#asp.net-mvc #Безопасность #архитектура #загрузка файла

Вопрос:

У меня есть проект asp mvc. И в нем я добавил структуру каталогов:

 ...
  UserUploads
    User_1
      Images
        Original
        Thumb
        Display
    User_2
    User_n
...
  

Как сделать эту структуру папок невидимой для пользователей? Я не хочу, чтобы неавторизованные пользователи видели эти изображения, введя url. У каждого пользователя есть свои собственные изображения, и только пользователь, который является «другом» какого-либо пользователя, может видеть его изображения. Я проверил изображения на Facebook, и адрес изображения выглядит так:

 http://a4.sphotos.ak.fbcdn.net/hphotos-ak-ash4/296040_2530953916384_1329592446_32898884_1499197273_n.jpg
  

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

Ответ №1:

Ну, вы можете использовать 2 подхода :

  1. реальная безопасность — полностью ограничить доступ к структуре папок и использовать только некоторый HttpHandler (или действие MVC) для их обслуживания (после оценки прав доступа, записи их в ответ через TransferFile или stream writer ..). Это очень плохо с точки зрения производительности — нет кэширования, обработка всей серверной части для каждого изображения и т. Д..

  2. безопасность «запутывания» — просто создайте имена файлов, которые нельзя угадать (Guid — хороший кандидат), поэтому никто, не имеющий доступа к странице, которая сгенерирует их имя файла в HTML, не сможет получить к ним прямой доступ. Конечно, если один «друг» получит к нему доступ, а затем передаст URL-адрес файла неавторизованному лицу, но он может так же легко отправить ему сам файл… Таким образом, производительность очень хорошая — файлы кэшируются (IIS и клиентом), вашему приложению не нужно обрабатывать запросы на изображения и т. Д.

Комментарии:

1. Это с именем файла в качестве GUID — хорошая идея. Таким образом, изображения в Интернете не могут быть полностью защищены. Теперь я беру изображение своего друга на Facebook и выхожу из системы, и я могу получить доступ к этому изображению. Проводной, но если работает для fb, он работает и для меня.

2. Я также использую идентификаторы GUID для имен файлов, сохраняя связь с реальным путем в БД. Каждый раз, когда запрашивается файл, я выполняю перевод GUID в путь на стороне сервера, получаю доступ к файлу и предоставляю его, не показывая путь загрузки (whis фактически находится вне домена содержимого IIS).

3. Реальная безопасность также может основываться на ACL, если пользователи проходят проверку подлинности Windows.

4. Пожалуйста, не используйте запутывание в качестве метода безопасности.

Ответ №2:

Просто ограничьте доступ к файлу web.config для этой папки UserUploadsFolder:

 <location path="UserUploads">
    <system.web>
        <authorization>
            <deny users="*"/>
        </authorization>
    </system.web>
</location>
  

Комментарии:

1. Но когда какой-либо пользователь входит в приложение, он авторизован. Может ли он видеть это изображения? И тогда он может видеть путь к какому-либо изображению, а затем он может угадать путь к кому-то другому изображению? Я прав?

2. Нет, если вы поставите deny = * — никто, кроме вашего приложения, не увидит изображения

3. Это верно только тогда, когда для runAllManagedModulesForAllRequests установлено значение true . Прямые запросы к файлам не проходят через asp.net трубопровод.