2009-01-21 15 views
6

¿Alguien sabe una buena práctica de proteger medios para asp.net?asp.net protección de medios

Necesito alojar una variedad de medios que requieren permiso para ver una imagen/video específico. es decir, un usuario específico puede o no tener permiso para ver un archivo multimedia, y este hecho puede modificarse sobre la marcha.

No me importa si pueden descargar un archivo multimedia al que tienen acceso, simplemente no quiero que ni siquiera estén al tanto de los elementos a los que no deberían tener acceso.

Ya he considerado la ofuscación de URL, esto me parece bastante difícil.

Tengo usuarios autenticados (y no estoy dispuesto a cambiar esto).

Me gustaría mantener la estructura de la carpeta de archivos multimedia no relacionada con los permisos.

Respuesta

11

Cree un HttpHandler al que se debe acceder a través de todos los medios. Luego, antes de recuperar el archivo y enviarlo al usuario, puede realizar las validaciones que desee. Mantenga todos sus medios fuera de la ruta principal de wwwroot o denegar el acceso a esa carpeta con los permisos.

Más información sobre este tema aquí:

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

+0

lol - eso es como nivelar el centro de comercio mundial con varias armas nucleares cuando podrías hacerlo más fácil y precisamente con un termómetro ... en serio - también hay imágenes públicas - la técnica debería funcionar solo con archivos/carpetas específicos . – mson

+0

Ummmm ... k. Entonces, ¿estás diciendo algo así en tu web.config no haría exactamente lo que estás pidiendo? Puede autorizar las visitas a/protected/lo que sea caso por caso con su autorización actual esquema. – Lusid

+0

Lo mejor es que no tiene que depender de que los usuarios modifiquen la URL para acceder a otros archivos. Fuerce al controlador para que requiera que los usuarios se autentiquen, luego realice una comprobación en la base de datos para determinar si tienen derechos sobre ese archivo. Entonces compartir URL tampoco funcionará sin compartir inicios de sesión también. – Lusid

0

Me gustaría sugerir una tabla que contiene los archivos a los que cada usuario tiene acceso:

UserID int 
FileID varchar 

continuación una tabla para sus archivos:

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

En el disco duro, nombre el archivo FileID (UniqueIdent) ifier) ​​y el FileType (la extensión, ej. .jpg). El fileID en la tabla de permisos mantendrá el UniqueIdentifier generado en la otra tabla.

Puede pasar esto a través de la URL sabiendo con relativa seguridad que el usuario no podrá adivinar el nombre de ningún otro archivo.

Actualización: esto es, por cierto, mucho más simple que escribir un HttpHandler o tratar con permisos de archivos. Sin embargo, aunque las posibilidades de que alguien adivine otro nombre de archivo son infinitesimales, no se trata de una seguridad hermética, ya que un usuario puede darle acceso a otro al archivo.

+0

esto es trivial para eludir – mson

+0

No estoy de acuerdo en el caso de adivinar un nombre de archivo. Si los usuarios conspiran para compartir los nombres de los archivos, entonces estás en lo correcto. Por lo tanto, si se aplica depende de la naturaleza del sitio. ¿Un sitio de música para niños? Olvídalo. ¿Un sitio corporativo que contiene obras de arte competidoras de varias compañías de diseño? Funciona bien. –

+0

alguien en una empresa sugirió esta técnica para datos confidenciales. comenzaron a moverse en esta dirección. Demostré la extracción no segura de los archivos multimedia en cuestión de una hora. si no es seguro, no es seguro. – mson

2

que utilizar un archivo XML como este para determinar qué usuarios/grupos tienen acceso a un archivo

<?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> 

archivos se almacenan por encima de la raíz http por lo que no se puede acceder a la URL.

Cuando un usuario intenta acceder a GetFile.aspx? File = file.doc me carga el XML, obtener la línea con

XmlNode xnFile= XML.GetElementById(wantedFile); 

, entonces llama a una función

HasAccess(Context.User, xnFile); 

que comprueba si el usuario ha iniciado sesión y compara los permisos, y si es aceptable para este usuario tenga el archivo, me leer los archivos desde el disco y escribirlos con

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(); 

en realidad ahora tengo más de un millar de archivos, y creo que de escribir los datos del archivo de la base de datos como el XML se corrompe t semana en 5 años, probablemente debido a bloqueos o uso simultáneo.

+0

+1 exactamente lo que haría – rizzle

+0

la imagen debe ser parte de la página, no un archivo separado. Además, si se descubre la ubicación secreta, ¿el usuario no tiene todos los archivos? – mson

+0

Componga su HTML para que parezca parte de la página. La ubicación secreta no está visible para el usuario, solo para la aplicación: c: \ mysite \ secretLocation vs. c: \ mysite \ webroot – Spikolynn

0

brownpaperpackage.aspx? Id = {GUID}

En el evento Load del media.aspx, se verifica que el usuario es autenticado, a continuación, compruebe que el usuario tiene el derecho de ver los medios de comunicación, y si lo hacen, a continuación, cargue los medios como una secuencia y alimente a la respuesta de la página como Spikolynn demostrado.

¿Por qué hacerlo de esta manera? Es simple de codificar y obtienes todos los beneficios de los servicios de autenticación de ASP.NET e IIS, desde los cuales puedes encontrar al usuario que solicita los medios. Es trivial mapear a ese usuario en una lista de acceso para sus objetos multimedia. Y la página tiene el objeto de solicitud allí mismo. También está ocultando el nombre de los medios, por lo que no puede decir qué está pasando desde la URL.

¿Cómo se evita que las personas accedan a sus medios de comunicación directamente? Sus archivos multimedia no se pueden almacenar en el directorio virtual de IIS. Si lo son, existe la posibilidad de que se puedan descargar directamente. Puede almacenarlos en una base de datos como una matriz de bytes (blob) o almacenarlos en un disco fuera del directorio virtual web. Los usuarios deben pasar por ASP.NET para acceder a los archivos

¿Cómo se hace un seguimiento de qué usuarios tienen acceso a qué medio? Mantiene un registro de sus usuarios a través de la membresía de asp.net. Eso significa que cada usuario tiene una ID en la tabla aspnet_users. Cree una tabla para sus medios con una identificación y un nombre de archivo (o un blob que contenga los medios reales). Entonces solo necesitas crear una tercera tabla que conecte los dos. Esta tabla contendría una identificación de usuario y una identificación de medios, lo que significa que este usuario puede ver este medio. Con el identificador de usuario (de afiliación asp.net) y el ID de soporte (de la URL) sólo tiene que

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

y si el contador> 0, el usuario puede ver los medios de comunicación.

Un ejemplo de cómo se tendría que utilizar la URL:

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

Desde su comentario en el Spikolynn responder

Estoy desconcertado - ¿cómo es esto diferente a la ofuscación? ¿Un usuario autenticado podría compartir una imagen (para la que está autorizado) con otro usuario autenticado pero no autorizado?

supongo que intenta evitar no autorizada compartir de los medios.

Esto es algo que muchas empresas (Microsoft, Apple, IBM, etc.) han puesto una cantidad considerable de dinero para resolver.La solución era DRM, y ahora la están eliminando, porque falló.

Por lo tanto, mi respuesta es que no puede evitar compartir si el usuario está dispuesto a hacer un esfuerzo para evitarlo.

Puede simplemente mantener a la gente honesta honesto mediante la aplicación de algunas técnicas como Spikolynn o Lusid explicar en sus respuestas.