Prácticas recomendadas en relación con las políticas de referencias y los referentes

Maud Nalpas
Maud Nalpas

En esta página, se describen algunas prácticas recomendadas para configurar tu Referrer-Policy y usar el referente en las solicitudes entrantes.

Resumen

  • Las filtraciones inesperadas de información entre orígenes dañan la privacidad de los usuarios web. Una política de referencia protectora puede ser de ayuda.
  • Considera establecer una política de referente de strict-origin-when-cross-origin. Conserva la mayor parte de la utilidad del referente y, al mismo tiempo, mitiga el riesgo de filtrar datos entre orígenes.
  • No uses URLs de referencia para la protección contra la falsificación de solicitudes entre sitios (CSRF). Usa tokens CSRF en su lugar y otros encabezados como una capa adicional de seguridad.

Conceptos básicos de Referrer y Referrer-Policy

Las solicitudes HTTP pueden incluir un encabezado Referer opcional, que indica el origen o la URL de la página web desde la que se realizó la solicitud. El encabezado Referrer-Policy define qué datos se ponen a disposición en el encabezado Referer.

En el siguiente ejemplo, el encabezado Referer incluye la URL completa de la página en site-one desde la que se realizó la solicitud.

Solicitud HTTP que incluye un encabezado de Referer
Una solicitud HTTP con un encabezado de Referer.

El encabezado Referer puede estar presente en diferentes tipos de solicitudes:

  • Solicitudes de navegación, cuando un usuario hace clic en un vínculo
  • Solicitudes de subrecursos, cuando un navegador solicita imágenes, iframes, secuencias de comandos y otros recursos que necesita una página.

En el caso de las navegaciones y los iframes, también puedes acceder a estos datos con JavaScript usando document.referrer.

Puedes aprender mucho de los valores de Referer. Por ejemplo, un servicio de estadísticas podría usarlos para determinar que el 50% de los visitantes de site-two.example provino de social-network.example. Sin embargo, cuando la URL completa, incluida la ruta y la cadena de consulta, se envía en Referer entre orígenes, puede poner en peligro la privacidad del usuario y crear riesgos de seguridad:

URLs con rutas de acceso asignadas a diferentes riesgos de privacidad y seguridad
Usar la URL completa puede afectar la seguridad y la privacidad del usuario.

Las URLs del 1 al 5 contienen información privada y, a veces, información sensible o de identificación. Filtrar estos datos de forma silenciosa entre los orígenes puede comprometer la privacidad de los usuarios web.

La URL n° 6 es una URL de capability. Si alguien que no sea el usuario previsto recibe este mensaje, una persona malintencionada puede tomar el control de la cuenta de este usuario.

Para restringir los datos de referencia que se ponen a disposición de las solicitudes de tu sitio, puedes establecer una política de referencia.

¿Qué políticas están disponibles y en qué se diferencian?

Puedes seleccionar una de las ocho políticas. Según la política, los datos disponibles del encabezado Referer (y document.referrer) pueden ser de los siguientes tipos:

  • No hay datos (no hay un encabezado Referer presente)
  • Solo el origen
  • La URL completa: origen, ruta y cadena de consulta
Datos que pueden
    incluirse en el encabezado de referencia y en document.referrer.
Ejemplos de datos de referencia.

Algunas políticas están diseñadas para comportarse de manera diferente según el contexto: solicitud de origen cruzado o de mismo origen, si el destino de la solicitud es tan seguro como el origen, o ambos. Esto es útil para limitar la cantidad de información que se comparte entre orígenes o a orígenes menos seguros, a la vez que mantienes la riqueza de la URL de referencia dentro de tu propio sitio.

En la siguiente tabla, se muestra cómo las políticas de referencia restringen los datos de URL disponibles desde el encabezado de referencia y document.referrer:

Alcance de la política Nombre de la política Referente: Sin datos Referer: Solo el origen URL de referencia: URL completa
No considera el contexto de la solicitud. no-referrer verificación
origin verificar
unsafe-url verificar
Se enfoca en la seguridad strict-origin Solicitud de HTTPS a HTTP Solicitación de HTTPS a HTTPS
o de HTTP a HTTP
no-referrer-when-downgrade Solicitud de HTTPS a HTTP Solicitud de HTTPS a HTTPS
o de HTTP a HTTP
Se enfoca en la privacidad origin-when-cross-origin Solicitud de origen cruzado Solicitud del mismo origen
same-origin Solicitud de origen cruzado Solicitud de mismo origen
Se enfocan en la privacidad y la seguridad strict-origin-when-cross-origin Solicitud de HTTPS a HTTP Solicitud entre orígenes
de HTTPS a HTTPS
o de HTTP a HTTP
Solicitud de mismo origen

MDN proporciona una lista completa de políticas y ejemplos de comportamiento.

Estos son algunos puntos que debes tener en cuenta cuando configures una política de URL de referencia:

  • Todas las políticas que tienen en cuenta el esquema (HTTPS en comparación con HTTP) (strict-origin, no-referrer-when-downgrade y strict-origin-when-cross-origin) tratan las solicitudes de un origen HTTP a otro de la misma manera que las solicitudes de un origen HTTPS a otro, aunque HTTP sea menos seguro. Esto se debe a que, para estas políticas, lo que importa es si se produce una reducción de nivel de seguridad, es decir, si la solicitud puede exponer datos de un origen encriptado a uno no encriptado, como en las solicitudes de HTTPS a HTTP. Una solicitud HTTP → HTTP no está encriptada, por lo que no hay una baja de versión.
  • Si una solicitud es de mismo origen, significa que el esquema (HTTPS o HTTP) es el mismo, por lo que no hay una baja de seguridad.

Políticas de referente predeterminadas en los navegadores

Hasta octubre de 2021

Si no se establece una política de referencia, el navegador usará su política predeterminada.

Navegador Referrer-Policy / Comportamiento predeterminado
Chrome El valor predeterminado es strict-origin-when-cross-origin.
Firefox El valor predeterminado es strict-origin-when-cross-origin.
A partir de la versión 93, para los usuarios de la Protección contra seguimiento estricto y la Navegación privada, se ignoran las políticas de referencia menos restrictivas no-referrer-when-downgrade, origin-when-cross-origin y unsafe-url para las solicitudes entre sitios, lo que significa que el referente siempre se recorta para las solicitudes entre sitios, independientemente de la política del sitio web.
Edge El valor predeterminado es strict-origin-when-cross-origin.
Safari El valor predeterminado es similar a strict-origin-when-cross-origin, con algunas diferencias específicas. Consulta Cómo evitar el seguimiento de la prevención de seguimiento para obtener más detalles.

Prácticas recomendadas para configurar la política de referer

Existen diferentes formas de configurar las políticas de referencia para tu sitio:

Puedes configurar diferentes políticas para diferentes páginas, solicitudes o elementos.

El encabezado HTTP y el elemento meta están a nivel de la página. El orden de prioridad para determinar la política vigente de un elemento es el siguiente:

  1. Política de nivel de elemento
  2. Política a nivel de la página
  3. Predeterminado del navegador

Ejemplo:

index.html:

<meta name="referrer" content="strict-origin-when-cross-origin" />
<img src="..." referrerpolicy="no-referrer-when-downgrade" />

La imagen se solicita con una política no-referrer-when-downgrade, y todas las demás solicitudes de subrecursos de esta página siguen la política strict-origin-when-cross-origin.

¿Cómo puedo ver la política de referentes?

securityheaders.com es útil para determinar qué política usa un sitio o una página específicos.

También puedes usar las herramientas para desarrolladores en Chrome, Edge o Firefox a fin de ver la política de URL de referencia que se usa para una solicitud específica. En el momento de escribir este artículo, Safari no muestra el encabezado Referrer-Policy, pero sí muestra el Referer que se envió.

Captura de pantalla del panel Network de las Herramientas para desarrolladores de Chrome que muestra Referer y Referrer-Policy.
El panel Red de las Herramientas para desarrolladores de Chrome con una solicitud seleccionada.

¿Qué política debes establecer para tu sitio web?

Te recomendamos que configures de forma explícita una política que mejore la privacidad, como strict-origin-when-cross-origin (o una más estricta).

¿Por qué "explícitamente"?

Si no estableces una política de referente, se usará la política predeterminada del navegador. De hecho, los sitios web suelen aplazar la configuración predeterminada del navegador. Sin embargo, esto no es ideal por los siguientes motivos:

  • Los diferentes navegadores tienen políticas predeterminadas diferentes, por lo que, si usas una configuración predeterminada del navegador, tu sitio no se comportará de forma predecible en todos los navegadores.
  • Los navegadores adoptan valores predeterminados más estrictos, como strict-origin-when-cross-origin, y mecanismos como el recorte de URLs de referencia para las solicitudes de origen cruzado. Aceptar de forma explícita una política que mejore la privacidad antes de que cambien los parámetros predeterminados del navegador te brinda control y te ayuda a ejecutar pruebas según lo consideres conveniente.

¿Por qué strict-origin-when-cross-origin (o más estricto)?

Necesitas una política que sea segura, que mejore la privacidad y que sea útil. El significado de "útil" depende de lo que quieras obtener del referente:

  • Seguro: Si tu sitio web usa HTTPS (si no es así, hazlo una prioridad), no quieres que las URLs de tu sitio web se filtren en las solicitudes que no son de HTTPS. Dado que cualquier persona de la red puede ver estos datos, las filtraciones expondrían a tus usuarios a ataques de intermediario. Las políticas no-referrer-when-downgrade, strict-origin-when-cross-origin, no-referrer y strict-origin resuelven este problema.
  • Mejora la privacidad: En el caso de una solicitud entre orígenes, no-referrer-when-downgrade comparte la URL completa, lo que puede causar problemas de privacidad. strict-origin-when-cross-origin y strict-origin solo comparten el origen, y no-referrer no comparte nada. Esto te deja con strict-origin-when-cross-origin, strict-origin y no-referrer como opciones para mejorar la privacidad.
  • Útil: no-referrer y strict-origin nunca comparten la URL completa, ni siquiera para solicitudes del mismo origen. Si necesitas la URL completa, strict-origin-when-cross-origin es una mejor opción.

Todo esto significa que strict-origin-when-cross-origin es, en general, una opción sensible.

Ejemplo: Cómo configurar una política de strict-origin-when-cross-origin

index.html:

<meta name="referrer" content="strict-origin-when-cross-origin" />

O del servidor, por ejemplo, en Express:

const helmet = require('helmet');
app.use(helmet.referrerPolicy({policy: 'strict-origin-when-cross-origin'}));

¿Qué sucede si strict-origin-when-cross-origin (o una opción más estricta) no se adapta a todos tus casos de uso?

En este caso, adopta un enfoque progresivo: establece una política protectora como strict-origin-when-cross-origin para tu sitio web y, si es necesario, una política más permisiva para solicitudes o elementos HTML específicos.

Ejemplo: política a nivel del elemento

index.html:

<head>
  <!-- document-level policy: strict-origin-when-cross-origin -->
  <meta name="referrer" content="strict-origin-when-cross-origin" />
  <head>
    <body>
      <!-- policy on this <a> element: no-referrer-when-downgrade -->
      <a src="…" href="…" referrerpolicy="no-referrer-when-downgrade"></a>
      <body></body>
    </body>
  </head>
</head>

Safari/WebKit podría limitar document.referrer o el encabezado Referer para las solicitudes entre sitios. Consulta los detalles.

Ejemplo: Política a nivel de la solicitud

script.js:

fetch(url, {referrerPolicy: 'no-referrer-when-downgrade'});

¿Qué más deberías considerar?

Tu política debe depender de tu sitio web y casos de uso, según lo determinen tú, tu equipo y tu empresa. Si algunas URLs contienen datos de identificación o sensibles, establece una política de protección.

Prácticas recomendadas para las solicitudes entrantes

A continuación, se incluyen algunos lineamientos sobre lo que debes hacer si tu sitio usa la URL de referencia de las solicitudes entrantes.

Protege los datos de los usuarios

El Referer puede contener datos privados, personales o de identificación, por lo que debes asegurarte de tratarlos como tales.

Los URLs de referencia entrantes pueden cambiar {referer-can-change}

El uso de la URL de referencia a partir de las solicitudes entrantes de origen cruzado tiene algunas limitaciones:

  • Si no tienes control sobre la implementación del emisor de solicitudes, no puedes hacer suposiciones sobre el encabezado Referer (y document.referrer) que recibes. El emisor de la solicitud puede decidir cambiar a una política de no-referrer en cualquier momento o, de manera más general, a una política más estricta que la que usaba antes. Esto significa que recibes menos datos de Referer que antes.
  • Los navegadores usan cada vez más el strict-origin-when-cross-origin de Referrer-Policy de forma predeterminada. Esto significa que, si el sitio del remitente no tiene configurada una política, es posible que ahora solo recibas el origen, en lugar de una URL de referencia completa, en las solicitudes de origen cruzado entrantes.
  • Es posible que los navegadores cambien la forma en que administran Referer. Por ejemplo, algunos desarrolladores de navegadores pueden decidir siempre recortar las URLs de referencia en función de los orígenes en las solicitudes de subrecursos de origen cruzado para proteger la privacidad del usuario.
  • Es posible que el encabezado Referer (y document.referrer) contenga más datos de los necesarios. Por ejemplo, puede tener una URL completa cuando solo deseas saber si la solicitud es de origen cruzado.

Alternativas a Referer

Es posible que debas considerar alternativas en los siguientes casos:

  • Una función esencial de tu sitio usa la URL de referencia de las solicitudes entrantes de origen cruzado.
  • Tu sitio ya no recibe la parte de la URL de referencia que necesita en una solicitud entre orígenes. Esto sucede cuando el emisor de la solicitud cambia su política o cuando no tiene una política establecida y cambia la política predeterminada del navegador (como en Chrome 85).

Para definir las alternativas, primero analiza qué parte del referente estás usando.

Si solo necesitas el origen

  • Si usas la URL de referencia en una secuencia de comandos que tiene acceso de nivel superior a la página, window.location.origin es una alternativa.
  • Si están disponibles, los encabezados como Origin y Sec-Fetch-Site te proporcionan el Origin o describen si la solicitud es de varios orígenes, lo que podría ser exactamente lo que necesitas.

Si necesitas otros elementos de la URL (ruta de acceso, parámetros de consulta, etc.)

  • Los parámetros de solicitud pueden abordar tu caso de uso, lo que te ahorra el trabajo de analizar el referente.
  • Si usas el referente en una secuencia de comandos que tiene acceso de nivel superior a la página, window.location.pathname podría funcionar como alternativa. Extrae solo la sección de ruta de la URL y pásala como argumento para que no se transmita información potencialmente sensible en los parámetros de la URL.

Si no puedes usar estas alternativas, haz lo siguiente:

  • Verifica si puedes cambiar tus sistemas para esperar que el emisor de solicitudes (por ejemplo, site-one.example) establezca de forma explícita la información que necesitas en algún tipo de configuración.
    • Ventajas: Más explícita, más preserva la privacidad de los usuarios de site-one.example y es más a prueba de futuro.
    • Contras: Es posible que tengas más trabajo o que los usuarios de tu sistema tengan más trabajo.
  • Verifica si el sitio que emite las solicitudes podría aceptar establecer una política de referer de no-referrer-when-downgrade por elemento o por solicitud.
    • Desventaja: Es posible que los usuarios de site-one.example preserven menos la privacidad y que no se admitan en todos los navegadores.

Protección contra la falsificación de solicitudes entre sitios (CSRF)

Un emisor de solicitudes siempre puede decidir no enviar el referente configurando una política no-referrer, y un usuario malicioso incluso podría falsificar el referente.

Usa tokens de CSRF como protección principal. Para obtener protección adicional, usa SameSite y, en lugar de Referer, usa encabezados como Origin (disponible en solicitudes POST y CORS) y Sec-Fetch-Site si está disponible.

Registro y depuración

Asegúrate de proteger los datos personales o sensibles de los usuarios que puedan estar en el objeto Referer.

Si solo usas el origen, verifica si puedes usar el encabezado Origin como alternativa. Esto podría brindarte la información que necesitas para depurar de una manera más sencilla y sin necesidad de analizar el referente.

Pagos

Los proveedores de pagos pueden depender del encabezado Referer de las solicitudes entrantes para las verificaciones de seguridad.

Por ejemplo:

  • El usuario hace clic en el botón Comprar en online-shop.example/cart/checkout.
  • online-shop.example redirecciona a payment-provider.example para administrar la transacción.
  • payment-provider.example verifica el Referer de esta solicitud en una lista de valores de Referer permitidos que configuran los comercios. Si no coincide con ninguna entrada de la lista, payment-provider.example rechaza la solicitud. Si coinciden, el usuario puede continuar con la transacción.

Prácticas recomendadas para las verificaciones de seguridad del flujo de pago

Como proveedor de pagos, puedes usar Referer como una verificación básica contra algunos ataques. Sin embargo, el encabezado Referer por sí solo no es una base confiable para una verificación. El sitio solicitante, ya sea un comercio legítimo o no, puede establecer una política de no-referrer que haga que la información de Referer no esté disponible para el proveedor de pagos.

Analizar Referer podría ayudar a los proveedores de pagos a detectar atacantes ingenuos que no configuraron una política no-referrer. Si usas Referer como primera verificación, haz lo siguiente:

  • No esperes que el Referer esté siempre presente. Si está presente, compruébalo solo con los datos mínimos que puede incluir, que es el origen.
    • Cuando configures la lista de valores Referer permitidos, asegúrate de incluir solo el origen y no la ruta de acceso.
    • Por ejemplo, los valores de Referer permitidos para online-shop.example deben ser online-shop.example, no online-shop.example/cart/checkout. Si esperas que no haya Referer o que el valor de Referer sea solo el origen del sitio solicitante, evitas los errores que podrían provenir de hacer suposiciones sobre el Referrer-Policy del comercio.
  • Si no hay Referer o si está presente y la verificación básica del origen de Referer se realiza correctamente, puedes pasar a otro método de verificación más confiable.

Para verificar los pagos de manera más confiable, permite que el solicitante hash los parámetros de la solicitud junto con una clave única. Luego, los proveedores de pagos pueden calcular el mismo hash de tu lado y solo aceptar la solicitud si coincide con tu cálculo.

¿Qué sucede con el Referer cuando un sitio de comercio HTTP sin política de referer redirecciona a un proveedor de pagos HTTPS?

No se puede ver ningún Referer en la solicitud al proveedor de pagos HTTPS, ya que la mayoría de los navegadores usan strict-origin-when-cross-origin o no-referrer-when-downgrade de forma predeterminada cuando un sitio web no tiene una política establecida. El cambio de Chrome a una nueva política predeterminada no cambiará este comportamiento.

Conclusión

Una política de referencia protectora es una excelente manera de brindarles más privacidad a tus usuarios.

Para obtener más información sobre las diferentes técnicas para proteger a tus usuarios, consulta nuestra colección Seguro y protegido.

Recursos

Muchas gracias a todos los revisores por sus contribuciones y comentarios, en especial a Kaustubha Govind, David Van Cleve, Mike West, Sam Dutton, Rowan Merewood, Jxck y Kayce Basques.