Esto es similar a esta pregunta , pero un poco más específico.
TL; DR; ¿Existe algún problema de seguridad con el hecho de permitir que las URL relativas proporcionadas por el usuario se encuentren en el encabezado Location:
en la redirección?
Background:
Estoy escribiendo un pequeño proxy para usar delante de CouchDB . Para autenticarse en la API de CouchDB, se debe enviar un POST al punto final /_session
como se describe aquí .
Este punto final toma un parámetro de consulta opcional, next
, que, cuando está presente, provocará que una solicitud de autenticación exitosa responda con 302
y un red co% Location:
, en lugar de un simple 200
.
Ahora CouchDB tiene lo que me parece una implementación insegura de esto. El valor next
simplemente se agrega al nombre de host del servidor (¡sin barra diagonal!). Así que una solicitud como esta:
POST /_session?next=foobar
Obtendrá una respuesta que incluye:
Location: http://someserver.comfoobar
Creo que esto es claramente malo, pero al menos el daño solo se limita a solicitudes autenticadas, por lo que un phisher al azar probablemente no pueda hacer mucho con él. Pero todavía me hace sentir un poco incómodo.
Por lo tanto, me parece que es necesario hacer alguna validación. Como mínimo, debe indicarse /
en la URL proporcionada por el usuario. Pero estoy pensando que un enfoque más simple podría ser simplemente validar que la URL proporcionada por el usuario es relativa, y luego responder solo con eso.
Así que para mi ejemplo:
POST /_session?next=foobar
Respondería con:
Location: /foobar
¿Es este un enfoque seguro?