none
Alternativa a imágenes en carpeta App_Data RRS feed

  • Pregunta

  • Hola:

    Estoy migrando una aplicación de escritorio que utilizo en mi empresa a asp.net vb y hasta ahí todo bien, pero me encuentro con un pequeño inconveniente y es que tengo que migrar al server carpetas de imágenes protegidas de clientes.

    Para que no se puedan abrir desde una URL he hecho pruebas ubicando una carpeta Images en App_Data pero no se muestran con img src="App_Data/Images/ImagenTal.jpg".

    He buscado sobre este asunto en la red pero no encuentro nada que me pueda ayudar.

    Ahora lo que busco es crear una carpeta que no se pueda abrir desde URL como si fuera una App_Data pero no sé cómo se dan esos permisos. Se me ocurre también cifrar las imágenes de alguna manera, o indicar de alguna forma en el dominio que si en la URL aparece el directorio "Images" que no se muestre y se redireccione a un Forbidden, pero no sé exactamente como llevar a la práctica algo así.

    Agradeceré a quien me pueda orientar para hacer opacas las imágenes a una cadena URL.

    Saludos al grupo.

    sábado, 25 de abril de 2015 9:16

Respuestas

  • hola

    >>En localhost puedo probar poniendo la carpeta de imágenes en D: por ejemplo y apuntando a las imágenes con una ruta física.

    esto no puedes hacerlo

    si pones una imagen fuera de la estructura del sitio web que defines en el IIS deberas acceder a la imagen por medio de una pagina o un handler

    aqui

    [ASP.NET] - Guardar Imagen base de datos

    explico en la primer parte como podrias hacerlo, como veras usas algo como ser http://sitio:puerto/Download.aspx?imagen=imagen1.jpg

    o sea en el responde pones el byte[] de la imagen que retorna la pagina o handler

    Nota: si se que el link dice base de datos, pero la primer parte explica como enviar por response una imagen que esta en una carpeta

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    sábado, 25 de abril de 2015 13:01

Todas las respuestas

  • Hola,

    Puedes almacenar las imágenes fuera de la carpeta de la aplicación o bloquear el directorio para evitar el acceso y luego servirlas usando un controlador ashx, de modo que cuando te pidan la imagen con ID=12 tu puedas servirla como http://miaplicacion/directorio_ficticio_de_images/12

    https://msdn.microsoft.com/es-es/library/ms227439(v=vs.100).aspx

    para bloquear directorios puedes usar un fichero web.config denegando el acceso a todos los usuarios

    https://msdn.microsoft.com/en-us/library/8aeskccd(v=vs.71).aspx

    Saludos,

    sábado, 25 de abril de 2015 10:28
  • Gracias, Cybernoyd por tu ayuda.

    Sigo trabajando en el asunto que no creía tan complicado pero las imágenes tienen que estar protegidas de que se puedan abrir desde una URL.

    No conocía ninguno de los métodos que me dices, voy a hacer pruebas, pero sobre la primera solución que aportas se me ocurre poner una carpeta de imágenes fuera de la carpeta httpdocs que es donde están los archivos de aplicación en el server. Otra cosa es que el server me deje acceder a esa ruta y cómo se escribe la ruta cuando algún directorio está fuera del directorio httpdocs, no lo sé porque no lo he hecho nunca pero lo sabré haciendo pruebas subiendo una carpeta de pruebas mediante ftp al server.
    En localhost puedo probar poniendo la carpeta de imágenes en D: por ejemplo y apuntando a las imágenes con una ruta física.

    Te diré el resultado cuando lo haga. De las otras soluciones, eso es totalmente nuevo para mí y también probaré si la primera solución no da resultado, pero lo veo complicado.

    Sobre la marcha otra cosa que se me ocurre es decir de alguna manera que si se escribe una cadena URL de tipo
    www.midominio.com/Images
    que no se autorice esa url, pero no sé si eso es posible.

    Un saludo.


    sábado, 25 de abril de 2015 11:39
  • hola

    permisos a una carpeta se da por medio del tag <location>

    Indicar elementos públicos o privados en un mismo sitio de ASP.NET

    si usas seguridad de asp.net membership podrias indicar que usuario o reles pueden acceder a esa carpeta, pagina o archivo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 25 de abril de 2015 12:34
  • Hola,

    Si puedes poner las imágenes fuera del httpdocs, de hecho la solución que te comentaba soporta esa idea, lo unico que tienes que hacer es programar el controlador para que sirva las imágenes de ese directorio.

    Lo del web.config que te comentaba de denegar el acceso hace exactamente lo ultimo que me comentas del directorio www.midominio.com/Imagenes deniega el acceso a todo el mundo.

    Haz las pruebas y me comentas, todo depende de hasta que punto necesites "ocultar" las imagenes a los usuarios

    sábado, 25 de abril de 2015 12:35
  • hola

    >>En localhost puedo probar poniendo la carpeta de imágenes en D: por ejemplo y apuntando a las imágenes con una ruta física.

    esto no puedes hacerlo

    si pones una imagen fuera de la estructura del sitio web que defines en el IIS deberas acceder a la imagen por medio de una pagina o un handler

    aqui

    [ASP.NET] - Guardar Imagen base de datos

    explico en la primer parte como podrias hacerlo, como veras usas algo como ser http://sitio:puerto/Download.aspx?imagen=imagen1.jpg

    o sea en el responde pones el byte[] de la imagen que retorna la pagina o handler

    Nota: si se que el link dice base de datos, pero la primer parte explica como enviar por response una imagen que esta en una carpeta

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    sábado, 25 de abril de 2015 13:01
  • Gracias por vuestra ayuda, pero lo que me proponéis son campos completamente nuevos para mí y llevará su tiempo hacer las pruebas.

    He intentado poner la carpeta fuera de httpdocs y no hay manera de leer nada desde ahí, en cuanto al controlador que me dices, cybernoid, no sé qué clase de controlador es ni cómo programarlo.

    Bien, mi aplicación está autenticada con una variable Session desde el form de una página que lee valores de una BD. Se trataría de que si la variable sesión no está autenticada, la carpeta no se puede abrir, pero no sé cómo hacer esto a una carpeta de imágenes, solo lo sé hacer a una página aspx por código en el load.

    Es decir, que si intento abrir una URL www.midominio.com/page.aspx si la variable sesión no está autenticada redirecciona a un forbidden. Pues lo mismo busco hacer cuando se trata de una imagen, es decir, que no se muestre cuando se intenta abrir www.midominio.com/CarpetaImages/ImagenTal.jpg. ¿se podrá aplicar el valor de la variable session aquí también?

    Seguiré probando vuestras propuestas.

    Un saludo.

    sábado, 25 de abril de 2015 15:38
  • Hola,

    Todo lo que comentas de la autenticacion y privacidad de las carpetas lo puedes solventar mediante el web.config, como bien dice Leandro mediante el atributo location puedes especificar los roles y usuarios que tienen acceso a las carpetas.

    Location

    FormsAuthentication

    Mírate esos enlaces que seguro que te dan ideas.

    sábado, 25 de abril de 2015 16:58
  • >>mi aplicación está autenticada con una variable Session desde el form de una página que lee valores de una BD

    eso esta muy pero muy mal, no se usan variables de Session para implementar al autenticacion, tiene que usar la seguridad integrada de asp.net

    Login – Usando Password con Hash

    usando el

    FormsAuthentication.RedirectFromLoginPage(); y definiendo el <authentication > en el web.config

    >>¿se podrá aplicar el valor de la variable session aquí también?

    no, no se puede

    usar la session para implementar seguridadno es correcto, porque estas implementando una seguridad mas que debil

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 25 de abril de 2015 19:25
  • Hola:

    Ya puse en práctica la autentificación de la aplicación desde el web.config, pero como todos sabemos, solo cubre las páginas aspx pero no las extensiones de imagen.

    Ahora me falta poner en práctica lo que me proponéis para que las imágenes no se puedan ver desde URL. Os diré de cualquier novedad.

    Un saludo.

    domingo, 26 de abril de 2015 21:01
  • Hola Cybernoid: estuve viendo la manera de bloquear una carpeta images al http y he visto este código en el foro de azure:

    <configuration>
       
    <system.webServer>
           
    <security>
               
    <requestFiltering>
                   
    <hiddenSegments>
                       
    <add segment="directorio_a_ocultar" />
                   
    </hiddenSegments>
               
    </requestFiltering>
           
    </security>
    <system.webServer>
    <configuration>

    pero lo único que ocurre es que las imágenes no se muestran.
    Es decir, que lo que hay que conseguir es que una vez se haya desbloqueado la aplicación mediante authentication y authorization mediante un form con un login esa misma autorización sirva también para desbloquear el directorio a ocultar como si fuera una página aspx.

    En cuanto a las soluciones que apunta Leandro, cada vez me estoy inclinando más por ocultar las imágenes protegidas en una base de datos y así poderlas colocar en la carpeta App_Data como datos de la BD, solo que yo ahora sigo con Access (con lo cual tendría que meterlas en un campo OLEDB) mientras no migre a sql server que tiene un campo image, y programo en VB pero tiene que haber alguna alternativa.

    De todas formas sigo trabajando en el asunto porque es muy importante que no se pueda acceder por http a las imágenes protegidas

    Un saludo.

    martes, 28 de abril de 2015 22:27
  • Hola,

    Disculpa el retraso, como ya te comente mas arriba otra solución es que saques la carpeta de la ruta de la aplicación y retornes la imagen mediante Handlers

    por ejemplo yo uso un código similar a este:

                context.Response.ContentType = "application/x-msdownload";
                //context.Response.AddHeader("Content-Length", a.decTamano.ToString());
                context.Response.AddHeader("Content-Disposition", "attachment; filename=" + a.strNombre);
                context.Response.TransmitFile(String.Format(rutaficheros + "\\{0}", a.strNombreEnDisco));
                context.Response.Flush();
                context.Response.End();

    Puedes llamar al Handler así GetImage.ashx?ImageCode=123456

    Saludos,

    jueves, 30 de abril de 2015 8:31
  • Gracias, Cybernoid, se trata de un campo completamente nuevo para mí.

    Según lo que me dices es para poder extraer imágenes de una carpeta que se coloca fuera del directorio httpdocs o de los subdominios que están al mismo nivel, es decir, si no me equivoco sería colocar una carpeta de imágenes a este mismo nivel y luego leer los archivos de imagen con este controlador.

    En tu código hay una variable a que no sé a qué se refiere y luego hay una rutaficheros que me imagino que será la ruta física desde C: en el server, ya que si pongo server.mappath apuntará al directorio httpdocs o a cualquier otro subdominio.

    Si consigo aclararme con esto haré alguna prueba. En cuanto a la otra posibilidad de meter la imágenes en la bd Access tampoco lo he conseguido.

    Un saludo

    jueves, 30 de abril de 2015 9:15
  • Perdona, el content type debe ser "image/jpeg"

    para que quede mas claro debe ser algo así:

    context.Response.ContentType = "image/jpeg";
                context.Response.TransmitFile("c:\\mi_imagen.jpg"));
                context.Response.Flush();
                context.Response.End();

    Yo creo que con eso debería funcionar. 

    Ya me cuentas, saludos!

    jueves, 30 de abril de 2015 9:54
  • Voy a ir probando.

    De todas formas, ya sea una imagen en un directorio o en una base de datos el handler hace falta porque la src de la imagen requiere una URL.

    Y si la imagen es png o bmp o gif no sé si habrá que hacer una instrucción para cada extensión, en fin, probaré. Mi duda todavía es que el server remoto me permita extraer datos de una carpeta en ese nivel, ponerla se puede, pero lo que no sé es si me va a dejar extraer los archivos.


    jueves, 30 de abril de 2015 9:58
  • Yo creo que lo ideal es que guardes las imágenes en un formato en concreto, yo en mi aplicación guardo todas las imágenes como jpeg.

    El Handler no es necesario siempre, solo es una manera de hacerlo, para representar imágenes también puedes hacerlo poniendo directamente el binario base64 dentro del HTML o también podrías traer temporalmente la imagen al directorio de la aplicación y mostrarla, maneras hay varias.

    http://es.wikipedia.org/wiki/Data:_URL

    jueves, 30 de abril de 2015 10:05