защита средств массовой информации asp.net - PullRequest
6 голосов
/ 21 января 2009

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

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

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

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

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

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

Ответы [ 5 ]

11 голосов
/ 21 января 2009

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

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

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

2 голосов
/ 27 января 2009

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

1 голос
/ 28 января 2009

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

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

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

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

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

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

0 голосов
/ 28 января 2009

brownpaperpackage.aspx? ID = {GUID}

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

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

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

Как вы отслеживаете, какие пользователи имеют доступ к каким медиа? Вы отслеживаете своих пользователей torugh 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" />
0 голосов
/ 21 января 2009

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

UserID int
FileID varchar

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

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

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

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

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

...