Mitigar los problemas de ciberseguridad de los custom headers en ASP.NET

Publicado el 16.01.2021 a las 16:54

Mitigar los problemas de ciberseguridad de los custom headers en ASP.NET

Mitigando problemas de ciberseguridad con customs HTTP headers en una web de ASP.NET

En este artículo vamos a ponérselo más complicado a los hackers comprometer nuestro sitio web de ASP.NET, ya sea una aplicación MVC, API REST, Core...


¿Qué es un custom header?

Los customs HTTP headers es información adicional a la solicitada por el cliente web que se manda desde el servidor.

Normalmente esta información no es relevante para un usuario estándar, pero sí lo será para los desarrolladores y en ocasiones estos customs HTTP headers solventará algún que otro problema.

¿Dónde puedo analizar mi sitio realizado con ASP.NET en cuanto a los customs HTTP headers?

Actualmente analizo mis sitio creados con ASP.NET en securityheaders.com


Es muy fácil de utilizar, introduces la URL de tu sitio y te da un análisis y te categoriza tu sitio con si fuera la categoría energética de un electrodoméstico.


A continuación te voy a enumerar los customs HTTP headers que son fácilmente configurables y que todo desarrollador de ASP.NET debería implementar.

X-Frame-Options

Este custom HTTP header garantiza que los hackers no hagan iframe en tu sitio para que no te lleven a sitios no deseados.

Si utilizas ASP.NET MVC 5 o alguno más reciente, este custom header se añade automáticamente, si no es tu caso y tu sitio es anterior es muy fácil añadir este custom HTTP header al web.config:

        <system.webServer>
          <httpProtocol>
            <customHeaders>
              <add name="X-Frame-Options" value="DENY" />
            </customHeaders>
          </httpProtocol>
        </system.webServer>
  

X-Xss-Protection

El x-xss-protection es una característica de los navegadores modernos. Parará la carga del sitio cuando se detecte un ataque cross-site scripting. Para añadirlo será tan fácil como añadir en el web.config:

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="X-Xss-Protection" value="1; mode=block" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
  

Si el valor es 1 quiere decir que se activa la protección

X-Content-Type-Options

Ayudará a que les resulte más difícil a los hackers identificar el tipo de MIME inspeccionando el contenido. Se añade fácilmente en el web.config:

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="X-Content-Type-Options" value="nosniff" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
  

Referrer-Policy

Los navegadores agregan automáticamente el encabezado Referer, cuando un usuario hace clic en un enlace en su sitio. Esto significa que un sitio web vinculado podrá ver de dónde vienen los usuarios. Si bien esta es una función excelente para Analytics, es posible que tenga información confidencial en sus URL, que no desea reenviar a otros dominios. Para eliminar la referencia por completo, agregue el siguiente encabezado a web.config:

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Referrer-Policy" value="no-referrer" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
  

Existe varios valores posibles para este custom HTTP header. Puedes ver todos los valores posibles en referrer-policy de mozilla.org

X-Permitted-Cross-Domain-Policies

Este header deshabilitará el uso de Flash en solicitudes de origen cruzado. Agregue en el web.config:

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="X-Permitted-Cross-Domain-Policies" value="none" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
  

Strict-Transport-Security

Si no ha implementado HTTPS en su sitio web, debería hacerlo.

Después de hacerlo, puede evitar que se produzca cualquier comunicación a través de HTTP utilizando el encabezado Strict-Transport-Security:

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
  

El max-age indica a los navegadores que utilicen esta configuración durante el número de segundos especificado. En este caso un año. La parte includeSubDomains puede excluirse si aloja sitios web que no son HTTPS en subdominios (como un blog).

X-Powered-By

Este header es añadido automáticamente por ASP.NET. Para no dar pistar a posibles atacantes sobre qué tecnología está corriendo tu sitio, se debería de eliminar este header:

  <system.webServer>
    <httpProtocol>
      <customHeaders>
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>
  </system.webServer>
  

X-AspNetMvc-Version

Al igual que X-Powered-By, X-AspNetMvc-Version es un header agregado automáticamente por ASP.NET. Para evitar decirle a los hackers que usa MVC y qué versión, debe eliminarlo.

X-AspNetMvc-Version no se puede eliminar a través de web.config, pero puede deshabilitarlo desde el código. Agregue lo siguiente a su Startup.cs o Global.asax.cs:

MvcHandler.DisableMvcResponseHeader = true;

Server

ASP.NET también revela el servidor que aloja la aplicación. Si un hacker sabe que está utilizando IIS, esto reduce la cantidad de debilidades que debe probar. Para eliminar el encabezado del servidor, elimínelo del código en un filtro o mediante Global.asax.cs:

  protected void Application_PreSendRequestHeaders()
  {
      if (HttpContext.Current != null)
      {
        HttpContext.Current.Response.Headers.Remove("Server");
      }
  }
  

Content-Security-Policy

Este header queda pendiente para otro artículo.

Resumiendo

Aquí tienes un resumen de todos los customs HTTP headers que deberías implementar:

        <httpProtocol>
          <customHeaders>
            <add name="Strict-Transport-Security" value="max-age=31536000"/>
            <add name="X-Content-Type-Options" value="nosniff"/>
            <add name="X-Xss-Protection" value="1; mode=block"/>
            <add name="X-Frame-Options" value="SAMEORIGIN"/>
            <add name="Content-Security-Policy" value="default-src 'self' https://fonts.googleapis.com/ https://fonts.gstatic.com/ 'unsafe-inline';" />
            <add name="Referrer-Policy" value="no-referrer-when-downgrade"/>
            <add name="Permissions-Policy" value="geolocation 'none';midi 'none';notifications 'none';push 'none';sync-xhr 'none';microphone 'none';camera 'none';magnetometer 'none';gyroscope 'none';speaker 'self';vibrate 'none';fullscreen 'self';payment 'none';"/>
            <remove name="X-Powered-By" />
            <remove name="X-AspNet-Version" />
            <remove name="Server" />
          </customHeaders>
        </httpProtocol>
  

Hasta luego 🖖

Servicios

Software

IoT

Digitalización

Aplicaciones móviles

Consultoría

fjmduran.com v0.2.2