Вопрос

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

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

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

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

У меня есть аутентифицированные пользователи (и я не хочу это менять).

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

Это было полезно?

Решение

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

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

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

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

Я использую такой 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 лет, возможно, из-за сбоев или одновременного использования.

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

  

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

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

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

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

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

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

UserID int
FileID varchar

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

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

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

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

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

Brownpaperpackage.aspx?id={guid}

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

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

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

Как вы отслеживаете, какие пользователи имеют доступ к каким носителям?Вы отслеживаете своих пользователей посредством членства в asp.net.Это означает, что у каждого пользователя есть идентификатор в таблице aspnet_users.Создайте таблицу для вашего медиафайла с идентификатором и именем файла (или большой двоичный объект, содержащий фактический медиафайл).Тогда вам просто нужно создать третью таблицу, которая соединяет две.Эта таблица будет содержать идентификатор пользователя и идентификатор носителя, что означает, что этот пользователь может просматривать этот носитель.Используя идентификатор пользователя (из членства в 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" />
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top