none
Evitar acceso a carpetas de servidor web mediante ASP.NET RRS feed

  • Pregunta

  • Tengo una aplicación web creada en ASP.NET donde hay una zona llamada DOCUMENTOS donde existen ficheros PDF y cuando un usuario entra en su web, le muestra sus ficheros asociados. En la estructura de carpetas de dicho usuario está el fichero web.config (el 25000 es el nombre de usuario) con este contenido

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
    <system.web>
    <authorization>
    <allow users="25000" />
    <deny users=" * " />
    </authorization>
    </system.web>
    </configuration>

    La estructura de carpetas es wwwroot/ficheros/<usuario>/ y dentro de cada <usuario> los ficheros PDF y el webconfig

    Ahora el tema ocurre que si en la carpeta 12345 tengo el fichero documento1.pdf y sin registrarme ni entrar en la aplicación pongo en el navegador http://paginaweb/ficheros/<usuario>/12345/documento1.pdf me lo muestra, cuando lo que quiero es que no lo permita si previamente no se ha validado en la aplicación

    ¿Cómo puedo hacer dicha acción?

    Gracias y saludos.
    viernes, 23 de febrero de 2018 11:30

Respuestas

  • El problema es que la configuración del web.config solo afecta a ASP.NET, pero los ficheros que IIS entiende y es capaz de servir directamente (tales como los pdf) los transmite directamente sin pasar por ASP.NET y por lo tanto sin tener en cuenta los permisos asignados en la configuración de ASP.NET.

    Hay varias soluciones:

    1) Añadir un "handler" en el .config para forzar a que esos ficheros pasen por ASP.NETÑ

    <handlers>
       
    <add name="HTMLHandler" type="System.Web.StaticFileHandler" path="*.pdf" verb="GET"  />
    </handlers>

    2) Si estás usando autenticación integrada, configurar impersonación para que el acceso se haga con la cuenta Windows del usuario, y restringir los permisos NTFS sobre la carpeta en disco.

    3) "Cerrar" la carpeta para que nadie acceda a ella (por ejemplo, sacándola del árbol de directorios de la aplicación web y poniéndola en otra ubicación del servidor que no se exponga a través del IIS). Y después, en los enlaces que se le dan al usuario, hacer que acceda al fichero a través de una página tal como "servirfichero.aspx?fichero=nombre". Obviamente, en "servirfichero.aspx" se comprueban los permisos oportunos y si son correctos se lee el fichero de disco y se devuelve a través del Response. Ojo a los ataques de "path traversal", asegúrate de validar el nombre de fichero recibido.

    viernes, 23 de febrero de 2018 12:44

Todas las respuestas

  • El problema es que la configuración del web.config solo afecta a ASP.NET, pero los ficheros que IIS entiende y es capaz de servir directamente (tales como los pdf) los transmite directamente sin pasar por ASP.NET y por lo tanto sin tener en cuenta los permisos asignados en la configuración de ASP.NET.

    Hay varias soluciones:

    1) Añadir un "handler" en el .config para forzar a que esos ficheros pasen por ASP.NETÑ

    <handlers>
       
    <add name="HTMLHandler" type="System.Web.StaticFileHandler" path="*.pdf" verb="GET"  />
    </handlers>

    2) Si estás usando autenticación integrada, configurar impersonación para que el acceso se haga con la cuenta Windows del usuario, y restringir los permisos NTFS sobre la carpeta en disco.

    3) "Cerrar" la carpeta para que nadie acceda a ella (por ejemplo, sacándola del árbol de directorios de la aplicación web y poniéndola en otra ubicación del servidor que no se exponga a través del IIS). Y después, en los enlaces que se le dan al usuario, hacer que acceda al fichero a través de una página tal como "servirfichero.aspx?fichero=nombre". Obviamente, en "servirfichero.aspx" se comprueban los permisos oportunos y si son correctos se lee el fichero de disco y se devuelve a través del Response. Ojo a los ataques de "path traversal", asegúrate de validar el nombre de fichero recibido.

    viernes, 23 de febrero de 2018 12:44
  • <handlers>
        
    <add name="HTMLHandler" type="System.Web.StaticFileHandler" path="*.pdf" verb="GET"  />
    </handlers>

    Si copio estas lineas dentro de web.config la página no me abre, y me salta error 500

    martes, 27 de febrero de 2018 22:48
  • hola

    pero estas implementando la seguridad de asp.net, porque esto que configuras solo aplica si defines

    <authentication mode="Forms"></authentication>

    puede que sea Forms o Windows segun si integras a windows la autenticacion o si es por medio de asp.net membership

    pero tienes que definir la seguridad, entonces cuando ingreses sino estas autenticado redirecciona a la pagina de login

    <authentication mode="Forms">
    <forms loginUrl="Logon.aspx" name=".ASPXFORMSAUTH"></forms>
      </authentication>

    How to: Implement Simple Forms Authentication

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 28 de febrero de 2018 2:16