Защита СМИ asp.net

Кто-нибудь знает хорошую практику защиты носителей для asp.net?

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

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

Я уже рассматривал обфускацию URL-адресов - мне это кажется довольно неуместным.

У меня есть пользователи, прошедшие проверку подлинности (и я не хочу это менять).

Я хотел бы, чтобы структура папок с медиафайлами не зависела от разрешений.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
692
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Создайте HttpHandler, через который должен быть доступ ко всем носителям. Затем, прежде чем получить файл и отправить его пользователю, вы можете выполнить любые проверки, которые захотите. Держите все свои мультимедиа за пределами основного пути wwwroot или запретите доступ к этой папке, используя разрешения.

Больше информации по этой теме здесь:

http://www.15seconds.com/Issue/020417.htm

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

mson 21.01.2009 22:40

Эмммм ... к. Итак, вы говорите, что что-то подобное в вашем web.config не будет делать именно то, что вы просите? <add verb = ""путь = " защищенный /" type = "MyProject.MyHandler, MyProject" /> Затем вы можете авторизовать любые обращения к / protected / что угодно в каждом конкретном случае, используя вашу текущую схему аутентификации.

Lusid 22.01.2009 00:04

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

Lusid 22.01.2009 00:07

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

Michael Haren 27.01.2009 20:31

+1 за это решение. Я не уверен, что это решение заслуживает краткого ответа автора (mson), это очень правильно и легко сделать.

Jon Tackabury 28.01.2009 22:54

извините - я не хотел извиняться. Казалось, что написать httphandler было довольно сложно. Я ленив и хотел посмотреть, есть ли более простой способ ... это решение похоже на ответ.

mson 29.01.2009 00:06

Я бы предложил таблицу с файлами, к которым у каждого пользователя есть доступ:

UserID int
FileID varchar

затем таблица для ваших файлов:

FileID    UniqueIdentifier
FileType  char(4)  <- so you know which extension to use.
etc...

На жестком диске присвойте файлу имя FileID (UniqueIdentifier) ​​и FileType (расширение, например .jpg). Идентификатор файла в таблице разрешений будет содержать уникальный идентификатор, созданный в другой таблице.

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

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

это легко обойти

mson 21.01.2009 22:07

Я не согласен с угадыванием имени файла. Если пользователи вступят в сговор, чтобы поделиться именами файлов, значит, вы правы. Таким образом, будет ли это применимо, зависит от характера сайта. Музыкальный сайт для детей? Забудь это. Корпоративный сайт с конкурирующими произведениями искусства от разных дизайнерских компаний? Работает отлично.

Mark Brittingham 21.01.2009 22:12

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

mson 21.01.2009 22:23

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

Mark Brittingham 21.01.2009 22:30

Я использую такой XML-файл, чтобы указать, какие пользователи / группы имеют доступ к файлу.

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE root[
    <!ELEMENT file ANY>
    <!ATTLIST file name ID #REQUIRED>
]>
<root>
    <file name = "file.doc" users = "155,321" groups = "grp5" />
    <file name = "file2.doc" users = "321" groups = "" />
</root>

файлы хранятся над корнем http, поэтому к ним нельзя получить доступ по URL.

Когда пользователь пытается получить доступ к GetFile.aspx? File = file.doc, я загружаю XML, получаю строку с

XmlNode xnFile= XML.GetElementById(wantedFile);

, затем я вызываю функцию

 HasAccess(Context.User, xnFile); 

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

FileInfo thisFile = new FileInfo(secretLocation + wantedFile);
Response.Clear();
Response.Buffer = false;
Response.BufferOutput = false;
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Length", thisFile.Length.ToString());
Response.AddHeader("Content-disposition", "filename = " + thisFile.Name);
Response.ContentType = "application/none";
Response.WriteFile(secretLocation + wantedFile);
Response.Close();
Response.End();
Response.ClearContent();
Response.ClearHeaders();

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

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

mson 27.01.2009 21:07

Вы составляете свой HTML так, чтобы он выглядел как часть страницы. Секретное местоположение не отображается для пользователя, только для приложения: c: \ mysite \ secretLocation vs. c: \ mysite \ webroot

Spikolynn 27.01.2009 22:37

Я озадачен - чем это отличается от обфускации? Сможет ли аутентифицированный пользователь поделиться изображением (для которого он авторизован) с другим аутентифицированным, но неавторизованным пользователем?

mson 28.01.2009 05:30

файл не отображается в Интернете. Программа считывает файл из специального места и передает его Только авторизованным пользователям.

Spikolynn 29.01.2009 13:21

brownpaperpackage.aspx? id = {guid}

В событии Load для media.aspx вы проверяете, что пользователь аутентифицирован, затем проверяете, что у пользователя есть право на просмотр мультимедиа, и, если они это делают, загружаете мультимедиа как поток и передаете его в ответ страницы, как показано Спиколинн .

Почему это так? Его просто кодировать, и вы получаете все преимущества служб проверки подлинности ASP.NET и IIS, из которых вы можете найти пользователя, запрашивающего носитель. Сопоставить этого пользователя со списком доступа к вашим медиа-объектам несложно. И у страницы есть объект запроса прямо здесь. Вы также скрываете имя носителя, поэтому вы не можете сказать, что происходит, по URL-адресу.

Как вы удерживаете людей от прямого доступа к вашим медиа? Ваши мультимедийные файлы нельзя хранить в виртуальном каталоге IIS. Если да, то есть вероятность, что их можно будет скачать напрямую. Вы можете хранить их в базе данных в виде массива байтов (blob) или хранить их на диске вне виртуального веб-каталога. Пользователи должны пройти через ASP.NET для доступа к файлам

Как вы отслеживаете, какие пользователи имеют доступ к каким медиа? Вы отслеживаете своих пользователей через членство в asp.net. Это означает, что у каждого пользователя есть идентификатор в таблице aspnet_users. Создайте таблицу для своего мультимедиа с идентификатором и именем файла (или blob, содержащий фактический носитель). Затем вам просто нужно создать третью таблицу, которая соединяет их. Эта таблица будет содержать идентификатор пользователя и идентификатор носителя, означающие, что этот пользователь может просматривать этот носитель. С идентификатором пользователя (из членства asp.net) и идентификатором мультимедиа (из URL-адреса) вам просто нужно

select count(*) from UserMedia where UserId = @UserGuid and MediaId = @MediaIdFromUrl

и если счетчик> 0, пользователь может просматривать медиа.

Пример использования URL:

<asp:image 
  runat = "server" 
  ImageUrl = "brownpaperpackage.aspx?id=53a2ea4(snip)76ca8b" />

Из вашего комментария в ответе Spikolynn

I'm puzzled - how is this different than obfuscation? Would an authenticated user be able to share an image (which they are authorized for) with another authenticated but unauthorized user?

Я предполагаю, что вы попробуете предотвратить несанкционированный совместное использование медиа.

Многие компании (Microsoft, Apple, IBM и т. д.) Вложили значительные средства в решение этой проблемы. Решение было DRM, а сейчас его убирают, потому что это не удалось.

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

Вы можете просто держать честных людей честными, применив некоторые методы, как Спиколинн или Lusid объясняют в своих ответах.

Другие вопросы по теме