En esta página, se describen algunas prácticas recomendadas para configurar tu Referrer-Policy y usar el referrer en las solicitudes entrantes.
Resumen
- La filtración inesperada de información entre orígenes daña la privacidad de los usuarios web. Una política de URL de referencia protectora puede ayudar.
- Considera establecer una política de URL de referencia de
strict-origin-when-cross-origin. Conserva la mayor parte de la utilidad del sitio de referencia y, al mismo tiempo, mitiga el riesgo de filtrar datos entre orígenes. - No uses URL de referencia para la protección contra falsificación de solicitudes entre sitios (CSRF). En su lugar, usa tokens CSRF y otros encabezados como una capa adicional de seguridad.
Introducción a Referer y Referrer-Policy
Las solicitudes HTTP pueden incluir un encabezado Referer opcional, que indica la URL de origen o de la página web desde la que se realizó la solicitud. El encabezado Referrer-Policy define qué datos están disponibles 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.
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, elementos iframe, 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 a través de document.referrer.
Puedes aprender mucho de los valores de Referer. Por ejemplo, un servicio de estadísticas podría usarlas para determinar que el 50% de los visitantes de site-two.example provienen 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:
Las URLs del 1 al 5 contienen información privada y, a veces, información sensible o de identificación. La filtración silenciosa de estos datos entre orígenes puede comprometer la privacidad de los usuarios web.
La URL núm. 6 es una URL de capacidad. Si alguien más que el usuario previsto recibe este código, una persona malintencionada puede tomar el control de la cuenta de este usuario.
Para restringir los datos de URL de referencia que están disponibles para las solicitudes de tu sitio, puedes establecer una política de URL 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 en el encabezado Referer (y document.referrer) pueden ser los siguientes:
- Sin datos (no hay encabezado
Referer) - Solo el origen
- La URL completa: origen, ruta y cadena de consulta
Algunas políticas están diseñadas para comportarse de manera diferente según el contexto: solicitud de origen cruzado o del 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 con orígenes menos seguros, y, al mismo tiempo, mantener la riqueza del referrer dentro de tu propio sitio.
En la siguiente tabla, se muestra cómo las políticas de URL de referencia restringen los datos de URL disponibles en el encabezado Referer y document.referrer:
| Alcance de la política | Nombre de la política | Referer: No data | Referer: Solo el origen | Referer: URL completa |
|---|---|---|---|---|
| No considera el contexto de la solicitud | no-referrer |
verificar | ||
origin |
verificar | |||
unsafe-url |
verificar | |||
| Enfoque en la seguridad | strict-origin |
Solicitud de HTTPS a HTTP | Solicitud 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 |
||
| Enfoque en la privacidad | origin-when-cross-origin |
Solicitud de origen cruzado | Solicitud del mismo origen | |
same-origin |
Solicitud de origen cruzado | Solicitud del mismo origen | ||
| Enfoque en la privacidad y la seguridad | strict-origin-when-cross-origin |
Solicitud de HTTPS a HTTP | Solicitud de origen cruzado de HTTPS a HTTPS o de HTTP a HTTP |
Solicitud del mismo origen |
MDN proporciona una lista completa de políticas y ejemplos de comportamiento.
Estos son algunos aspectos 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 frente a HTTP) (
strict-origin,no-referrer-when-downgradeystrict-origin-when-cross-origin) tratan las solicitudes de un origen HTTP a otro origen HTTP de la misma manera que las solicitudes de un origen HTTPS a otro origen HTTPS, aunque HTTP sea menos seguro. Esto se debe a que, para estas políticas, lo que importa es si se produce una degradación de seguridad, es decir, si la solicitud puede exponer datos de un origen encriptado a uno sin encriptar, como en las solicitudes de HTTPS → HTTP. Una solicitud HTTP → HTTP no está encriptada, por lo que no hay degradación. - Si una solicitud es del mismo origen, significa que el esquema (HTTPS o HTTP) es el mismo, por lo que no hay una degradación de la seguridad.
Políticas de URL de referencia predeterminadas en los navegadores
A partir de octubre de 2021
Si no se establece ninguna política de URL de referencia, el navegador usa su política predeterminada.
| Navegador | Comportamiento o Referrer-Policy 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 estricta y la Navegación privada, se ignoran las políticas de URL de referencia menos restrictivas no-referrer-when-downgrade,
origin-when-cross-origin y unsafe-url para las solicitudes entre sitios, lo que significa que la URL de referencia siempre se trunca 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 URL de referencia
Existen diferentes formas de establecer políticas de URL de referencia para tu sitio:
- Como encabezado HTTP
- Dentro de tu HTML
- Desde JavaScript por solicitud
Puedes establecer políticas diferentes para distintas páginas, solicitudes o elementos.
El encabezado HTTP y el elemento meta son a nivel de la página. El orden de prioridad para determinar la política vigente de un elemento es el siguiente:
- Política a nivel del elemento
- Política a nivel de la página
- Configuración predeterminada 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 recursos secundarios de esta página siguen la política strict-origin-when-cross-origin.
¿Cómo puedo ver la política de URL de referencia?
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 para ver la política de URL de referencia que se usa para una solicitud específica. Al momento de escribir este documento, Safari no muestra el encabezado Referrer-Policy, pero sí muestra el Referer que se envió.
¿Qué política debes establecer para tu sitio web?
Te recomendamos que establezcas explícitamente 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 URL de referencia, se usará la política predeterminada del navegador. De hecho, los sitios web suelen diferir a la política predeterminada del navegador. Sin embargo, esto no es ideal por los siguientes motivos:
- Los diferentes navegadores tienen diferentes políticas predeterminadas, por lo que, si dependes de la configuración predeterminada del navegador, tu sitio no se comportará de manera predecible en todos los navegadores.
- Los navegadores están adoptando valores predeterminados más estrictos, como
strict-origin-when-cross-origin, y mecanismos como el recorte de URL de referencia para las solicitudes de origen cruzado. Habilitar explícitamente una política que mejore la privacidad antes de que cambien los valores predeterminados del navegador te brinda control y te ayuda a ejecutar pruebas según lo consideres adecuado.
¿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 sitio de referencia:
- Seguro: Si tu sitio web usa HTTPS (si no es así, conviértelo en una prioridad), no querrás que las URLs de tu sitio web se filtren en solicitudes que no sean HTTPS. Dado que cualquier persona en la red puede verlos, las filtraciones expondrían a tus usuarios a ataques de intermediario. Las políticas
no-referrer-when-downgrade,strict-origin-when-cross-origin,no-referrerystrict-originresuelven este problema. - Mejora la privacidad: Para una solicitud de origen cruzado,
no-referrer-when-downgradecomparte la URL completa, lo que puede causar problemas de privacidad.strict-origin-when-cross-originystrict-originsolo comparten el origen, yno-referrerno comparte nada. Esto te deja constrict-origin-when-cross-origin,strict-originyno-referrercomo opciones que mejoran la privacidad. - Útiles:
no-referrerystrict-originnunca comparten la URL completa, ni siquiera para las solicitudes del mismo origen. Si necesitas la URL completa,strict-origin-when-cross-origines una mejor opción.
Todo esto significa que strict-origin-when-cross-origin suele ser una opción sensata.
Ejemplo: Cómo establecer una política de strict-origin-when-cross-origin
index.html:
<meta name="referrer" content="strict-origin-when-cross-origin" />
O bien, del lado 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 un nivel más estricto) 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 debes tener en cuenta?
Tu política debe depender de tu sitio web y tus casos de uso, según lo determinen tú, tu equipo y tu empresa. Si algunas URLs contienen datos sensibles o de identificación, establece una política de protección.
Prácticas recomendadas para las solicitudes entrantes
A continuación, se incluyen algunos lineamientos sobre qué 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 tratarlo como tal.
Los sitios de referencia entrantes pueden cambiar {referer-can-change}
El uso de la URL de referencia de las solicitudes entrantes de origen cruzado tiene algunas limitaciones:
- Si no tienes control sobre la implementación del emisor de la solicitud, no puedes hacer suposiciones sobre el encabezado
Referer(ydocument.referrer) que recibes. El emisor de la solicitud puede decidir cambiar a una políticano-referreren cualquier momento o, en general, a una política más estricta que la que usaba antes. Esto significa que recibirás menos datos delRefererque antes. - Los navegadores usan cada vez más la Referrer-Policy
strict-origin-when-cross-originde forma predeterminada. Esto significa que es posible que ahora solo recibas el origen, en lugar de una URL de referencia completa, en las solicitudes de origen cruzado entrantes si el sitio remitente no tiene establecida ninguna política. - Es posible que los navegadores cambien la forma en que administran
Referer. Por ejemplo, algunos desarrolladores de navegadores podrían decidir siempre truncar los URL de referencia a orígenes en las solicitudes de subrecursos de origen cruzado para proteger la privacidad del usuario. - El encabezado
Referer(ydocument.referrer) puede contener más datos de los que necesitas. Por ejemplo, podría tener una URL completa cuando solo quieres 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 de origen cruzado. Esto sucede cuando el emisor de la solicitud cambia su política o cuando no tiene una política establecida y la política predeterminada del navegador cambió (como en Chrome 85).
Para definir alternativas, primero analiza qué parte de la URL de referencia utilizas.
Si solo necesitas el origen
- Si usas el URL de referencia en una secuencia de comandos que tiene acceso de nivel superior a la página,
window.location.origines una alternativa. - Si están disponibles, los encabezados como
OriginySec-Fetch-Sitete brindan elOrigino describen si la solicitud es de origen cruzado, lo que podría ser exactamente lo que necesitas.
Si necesitas otros elementos de la URL (ruta de acceso, parámetros de consulta, etcétera)
- Los parámetros de la solicitud pueden abordar tu caso de uso, lo que te ahorra el trabajo de analizar la URL de referencia.
- Si usas el URL de referencia en una secuencia de comandos que tiene acceso de nivel superior a la página,
window.location.pathnamepodría funcionar como alternativa. Extrae solo la sección de ruta de la URL y pásala como argumento, de modo que no se pase ninguna información potencialmente sensible en los parámetros de la URL.
Si no puedes usar estas alternativas, haz lo siguiente:
- Comprueba si puedes cambiar tus sistemas para que esperen que el emisor de la solicitud (por ejemplo,
site-one.example) establezca de forma explícita la información que necesitas en algún tipo de configuración.- Ventaja: Es más explícito, preserva mejor la privacidad de los usuarios de
site-one.exampley es más resistente al paso del tiempo. - Desventaja: Es posible que debas realizar más trabajo o que los usuarios de tu sistema deban hacerlo.
- Ventaja: Es más explícito, preserva mejor la privacidad de los usuarios de
- Comprueba si el sitio que emite las solicitudes podría aceptar establecer una política de URL de referencia por elemento o por solicitud de
no-referrer-when-downgrade.- Desventaja: Es posible que preserve menos la privacidad de los usuarios de
site-one.exampley que no sea compatible con todos los navegadores.
- Desventaja: Es posible que preserve menos la privacidad de los usuarios de
Protección contra falsificación de solicitudes entre sitios (CSRF)
Un emisor de solicitudes siempre puede decidir no enviar el URL de referencia configurando una política de no-referrer, y un actor malicioso podría incluso suplantar el URL de referencia.
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.
Registra y depura
Asegúrate de proteger los datos personales o sensibles de los usuarios que puedan estar en el Referer.
Si solo usas el origen, verifica si puedes usar el encabezado Origin como alternativa. Esto podría proporcionarte la información que necesitas para depurar de una manera más sencilla y sin necesidad de analizar el sitio de referencia.
Pagos
Es posible que los proveedores de pagos se basen en el encabezado Referer de las solicitudes entrantes para realizar verificaciones de seguridad.
Por ejemplo:
- El usuario hace clic en el botón Comprar en
online-shop.example/cart/checkout. online-shop.exampleredirecciona apayment-provider.examplepara administrar la transacción.payment-provider.exampleverifica elRefererde esta solicitud en una lista de valores deRefererpermitidos que establecen los comercios. Si no coincide con ninguna entrada de la lista,payment-provider.examplerechaza la solicitud. Si coincide, el usuario puede continuar con la transacción.
Prácticas recomendadas para las verificaciones de seguridad del flujo de pagos
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.
Observar el Referer podría ayudar a los proveedores de pagos a detectar atacantes ingenuos que no establecieron una política de no-referrer. Si usas Referer como primera verificación, haz lo siguiente:
- No esperes que
Referersiempre esté presente. Si está presente, verifícala solo con los datos mínimos que puede incluir, que son el origen.- Cuando configures la lista de valores de
Refererpermitidos, asegúrate de incluir solo el origen y ninguna ruta. - Por ejemplo, los valores de
Refererpermitidos paraonline-shop.exampledeben seronline-shop.example, noonline-shop.example/cart/checkout. Si esperas que no haya ningúnReferero que haya un valor deRefererque solo sea el origen del sitio solicitante, evitarás errores que podrían surgir por hacer suposiciones sobre elReferrer-Policydel comercio.
- Cuando configures la lista de valores de
- Si falta el
Referer, o si está presente y la verificación básica del origenRefererse realiza correctamente, puedes pasar a otro método de verificación más confiable.
Para verificar los pagos de forma más confiable, permite que el solicitante genere un hash de 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 comercial HTTP sin una política de URL de referencia redirecciona a un proveedor de pagos HTTPS?
No se ve 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 establecida ninguna política.
El cambio de Chrome a una nueva política predeterminada no modificará este comportamiento.
Conclusión
Una política de URL de referencia protectora es una excelente manera de brindarles más privacidad a los usuarios.
Para obtener más información sobre las diferentes técnicas para proteger a tus usuarios, consulta nuestra colección Seguridad y protección.
Recursos
- Información sobre "mismo sitio" y "mismo origen"
- Un nuevo encabezado de seguridad: Política de URL de referencia (2017)
- Referrer-Policy en MDN
- Encabezado Referer: Problemas de privacidad y seguridad en MDN
- Cambio en Chrome: intención de Blink para implementar
- Cambio en Chrome: Intención de Blink de lanzar la función
- Cambio en Chrome: entrada de estado
- Publicación de blog sobre el cambio en Chrome 85 beta
- Hilo de GitHub sobre el recorte de URL de referencia: qué hacen los diferentes navegadores
- Especificación de Referrer-Policy
Agradecemos mucho las contribuciones y los comentarios de todos los revisores, en especial de Kaustubha Govind, David Van Cleve, Mike West, Sam Dutton, Rowan Merewood, Jxck y Kayce Basques.