Кто-нибудь знает хорошую практику защиты носителей для asp.net?
Мне нужно разместить множество носителей, для которых требуется разрешение на просмотр определенного изображения / видео. то есть конкретный пользователь может иметь или не иметь разрешение на просмотр медиафайла - и этот факт может быть изменен на лету.
Меня не волнует, могут ли они загрузить мультимедийный файл, к которому у них есть доступ, я просто не хочу, чтобы они даже знали об элементах, к которым у них не должно быть доступа.
Я уже рассматривал обфускацию URL-адресов - мне это кажется довольно неуместным.
У меня есть пользователи, прошедшие проверку подлинности (и я не хочу это менять).
Я хотел бы, чтобы структура папок с медиафайлами не зависела от разрешений.





Создайте HttpHandler, через который должен быть доступ ко всем носителям. Затем, прежде чем получить файл и отправить его пользователю, вы можете выполнить любые проверки, которые захотите. Держите все свои мультимедиа за пределами основного пути wwwroot или запретите доступ к этой папке, используя разрешения.
Больше информации по этой теме здесь:
http://www.15seconds.com/Issue/020417.htm
Эмммм ... к. Итак, вы говорите, что что-то подобное в вашем web.config не будет делать именно то, что вы просите? <add verb = ""путь = " защищенный /" type = "MyProject.MyHandler, MyProject" /> Затем вы можете авторизовать любые обращения к / protected / что угодно в каждом конкретном случае, используя вашу текущую схему аутентификации.
Самое приятное то, что вам не нужно полагаться на то, что пользователи изменяют URL-адрес, чтобы перейти к другим файлам. Заставьте обработчик требовать аутентификации пользователей, а затем выполните проверку в базе данных, чтобы определить, есть ли у них права на этот файл. Тогда совместное использование URL-адресов не будет работать даже без обмена логинами.
Это действительно не тяжелое решение - это правильный способ сделать это, потому что оно ясное, легкое и легкое. +1
+1 за это решение. Я не уверен, что это решение заслуживает краткого ответа автора (mson), это очень правильно и легко сделать.
извините - я не хотел извиняться. Казалось, что написать httphandler было довольно сложно. Я ленив и хотел посмотреть, есть ли более простой способ ... это решение похоже на ответ.
Я бы предложил таблицу с файлами, к которым у каждого пользователя есть доступ:
UserID int
FileID varchar
затем таблица для ваших файлов:
FileID UniqueIdentifier
FileType char(4) <- so you know which extension to use.
etc...
На жестком диске присвойте файлу имя FileID (UniqueIdentifier) и FileType (расширение, например .jpg). Идентификатор файла в таблице разрешений будет содержать уникальный идентификатор, созданный в другой таблице.
Вы можете передать это через URL-адрес, зная с относительной безопасностью, что пользователь не сможет угадать имя любого другого файла.
Обновление: это, кстати, много проще, чем писать HttpHandler или иметь дело с разрешениями на файлы. Однако, хотя вероятность того, что кто-то угадывает другое имя файла, бесконечно мала, это не является надежной защитой, поскольку один пользователь может предоставить другому доступ к файлу.
это легко обойти
Я не согласен с угадыванием имени файла. Если пользователи вступят в сговор, чтобы поделиться именами файлов, значит, вы правы. Таким образом, будет ли это применимо, зависит от характера сайта. Музыкальный сайт для детей? Забудь это. Корпоративный сайт с конкурирующими произведениями искусства от разных дизайнерских компаний? Работает отлично.
кто-то в компании предложил эту технику для конфиденциальных данных. они начали двигаться в этом направлении. Я продемонстрировал незащищенное извлечение медиафайлов в течение часа. если это не безопасно, это не безопасно.
Интересно - как вы узнали личность файла? Они использовали UniqueIdentifiers? Я хотел бы знать больше, поскольку у меня есть некоторые файлы с довольно низким уровнем защиты, которые я скрываю таким образом (мне все равно, если кто-то их увидит, я просто не хочу, чтобы они были легко угадываемыми).
Я использую такой 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 лет, вероятно, из-за сбоев или одновременного использования.
изображение должно быть частью страницы, а не отдельным файлом. Также - если секретное местоположение обнаружено, разве у пользователя нет всех файлов?
Вы составляете свой HTML так, чтобы он выглядел как часть страницы. Секретное местоположение не отображается для пользователя, только для приложения: c: \ mysite \ secretLocation vs. c: \ mysite \ webroot
Я озадачен - чем это отличается от обфускации? Сможет ли аутентифицированный пользователь поделиться изображением (для которого он авторизован) с другим аутентифицированным, но неавторизованным пользователем?
файл не отображается в Интернете. Программа считывает файл из специального места и передает его Только авторизованным пользователям.
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 объясняют в своих ответах.
lol - это как сравнять мировой торговый центр несколькими ядерными боеголовками, когда можно было бы легче и точнее сделать это с каким-нибудь термитом ... серьезно - есть также публичные изображения - техника должна работать только с определенными файлами / папками.