El error del enlace de seguimiento que rompe las URLs firmadas

Un error puede ocultarse en tu código durante mucho tiempo. Funciona para la mayoría de los enlaces. Pasa desapercibido en los enlaces de marketing. Pero rompe los enlaces que más importan.

Encontré este error en mi herramienta, mail-history. Rompe las URLs firmadas. Estas son enlaces utilizados para la verificación de correo electrónico o descargas seguras.

Así fue como sucedió.

Mi herramienta reescribe el HTML del correo electrónico para rastrear los clics. Toma la URL original, la cifra y la convierte en un enlace de seguimiento. Cuando un usuario hace clic, la herramienta descifra la URL y lo envía al destino real.

El problema comenzó cuando extraje la URL del HTML renderizado.

Laravel y Blade escapan los atributos HTML. Un ampersand en una URL se convierte en una entidad HTML. Pasa de & a &.

Para un enlace estándar, el navegador corrige esto automáticamente. Nunca notas la diferencia.

Pero mi herramienta no envía el enlace a un navegador. Envía la cadena a una función de descifrado.

Si tu URL firmada se ve así: https://example.com/verify?expires=123&signature=abc

El HTML se ve así: https://example.com/verify?expires=123&signature=abc

Mi herramienta cifra la versión con &. Cuando el usuario hace clic, la herramienta la descifra y lo envía a la versión con &.

Laravel ve el & y piensa que la firma es incorrecta. La verificación falla.

La solución es una sola línea de código. Uso html_entity_decode para convertir & de nuevo en & antes de que ocurra el cifrado.

Esto asegura que la URL descifrada coincida con la URL firmada original byte por byte.

Una lección para tu trabajo:

  • Si extraes datos de un HTML renderizado para usarlos en una función, asume que están escapados.
  • Los navegadores perdonan errores. El cifrado y la validación de firmas no.
  • Cuando uses una solución de una sola línea, escribe una prueba para ella.

Escribí una prueba que comprueba específicamente la presencia de &. Si un desarrollador en el futuro elimina mi solución durante una limpieza, la prueba fallará inmediatamente.

Fuente: https://dev.to/nasrulhazim/the-tracking-link-bug-that-only-breaks-signed-urls-38c