Las preocupaciones de diferencia de redirección POST
, PUT
y DELETE
las solicitudes y cuáles son las expectativas del servidor son para el comportamiento del agente de usuario ( RFC 2616
):
Nota: RFC 1945 y RFC 2068 especifican que el cliente no puede cambiar el método en la solicitud redirigida. Sin embargo, la mayoría de las implementaciones de agentes de usuario existentes tratan 302 como si fuera una respuesta 303, realizando un GET en el valor de campo Ubicación, independientemente del método de solicitud original. Los códigos de estado 303 y 307 se han agregado para los servidores que desean dejar claro claramente qué tipo de reacción se espera del cliente.
Además, lea el artículo de Wikipedia sobre los códigos de redireccionamiento 30x .
El 307 surgió porque los agentes de usuario adoptaron un comportamiento de facto para tomar solicitudes POST que reciben una respuesta 302 y enviar una solicitud GET al encabezado de respuesta de Ubicación.
Ese es el comportamiento incorrecto : solo un 303 debería hacer que un POST se convierta en un GET. Los agentes de usuario deben (pero no) seguir con el método POST cuando solicitan la nueva URL si la solicitud POST original devolvió un 302.
307 se introdujo para permitir que los servidores aclaren al agente de usuario que el cliente no debe realizar un cambio de método al seguir el encabezado de respuesta de Ubicación.
fuente
302
incorrectamente. Chrome 30, IE10. Se convirtió en la implementación incorrecta de facto ; eso no se puede cambiar porque muchos sitios web emiten por error el 302. De hecho, ASP.net MVC emite incorrectamente 302, dependiendo del hecho de que los navegadores lo manejan incorrectamente.303
también se introdujo307
en la especificación HTTP 1.1 y, por lo tanto, permite la compatibilidad con los agentes de usuario HTTP 1.0. Por supuesto, la verdadera pregunta es ¿deberíamos seguir manejando agentes de usuario HTTP 1.0 ahora?Response.RedirectSeeOther
), y si el cliente no es 1.1 (por ejemplo )GET /foo.html
,GET /foo.html HTTP/1.0
entonces emita el legado302
.Un buen ejemplo de la
307 Internal Redirect
acción es cuando Google Chrome encuentra una llamada HTTP a un dominio que sabe que requiere Seguridad de transporte estricta.El navegador redirige sin problemas, utilizando el mismo método que la llamada original.
fuente
Ejemplo de uso: URL movida de
/register-form.html
asignup-form.html
.El método cambiará a GET, según RFC 7231: "Por razones históricas, un agente de usuario PUEDE cambiar el método de solicitud de POST a GET para la solicitud posterior".
Ejemplo de uso: si el navegador envió POST a
/register.php
, ahora carga (GET)/success.html
.Ejemplo de uso: si el navegador envió una POST a
/register.php
, entonces esto le dice que rehaga la POST en/signup.php
.RFC 7231 (desde 2014) es muy legible y no demasiado detallado. Si quieres saber la respuesta exacta, es una lectura recomendada. Algunas otras respuestas usan RFC 2616 de 1999, pero nada cambió.
RFC 7238 especifica el estado 308. Se considera experimental, pero ya fue compatible con todos los principales navegadores en 2016.
fuente
ESPERADO para 302: la redirección utiliza el mismo método de solicitud POST en NEW_URL
ACTUAL para 302, 303: redirige el método de solicitud de cambios de POST a GET en NEW_URL
ACTUAL para 307: la redirección utiliza el mismo método de solicitud POST en NEW_URL
fuente
302 es una redirección temporal, que es generada por el servidor, mientras que 307 es una respuesta de redireccionamiento interno generada por el navegador. La redirección interna significa que la redirección se realiza automáticamente por el navegador internamente, básicamente el navegador altera la url ingresada de http a https en obtener la solicitud por sí mismo antes de realizar la solicitud, por lo que la solicitud de conexión no segura nunca se realiza a Internet. Si el navegador alterará la URL a https o no, depende de la lista de precarga de hsts que viene preinstalada con el navegador. También puede agregar cualquier sitio que admita https a la lista ingresando el dominio en la lista de precarga de hsts de su propio navegador que se encuentra en chrome: //net-internals/#hsts. Los propietarios de los dominios de sitios web pueden agregar algo más. para precargar la lista completando el formulario en https://hstspreload.org/por lo que viene preinstalado en los navegadores para cada usuario, aunque menciono que también puede hacerlo especialmente por usted mismo.
Permítanme explicarlo con un ejemplo:
hice una solicitud de obtención a http://www.pentesteracademy.com que solo admite https y no tengo ese dominio en mi lista de precarga de hsts en mi navegador ya que el propietario del sitio no se ha registrado en él venir con la lista de precarga de hsts preinstalada La solicitud GET para la versión no segura del sitio se redirige a la versión segura (consulte la ubicación con el encabezado http para eso en respuesta en la imagen de arriba). Ahora agrego el sitio a mi propia lista de precarga del navegador agregando su dominio en el formulario Agregar dominio hsts en chrome: // net-internals / # hsts, que modifica mi lista de precarga personal en mi navegador Chrome. Asegúrese de seleccionar incluir subdominios para Opción STS allí. Veamos la solicitud y la respuesta para el mismo sitio web ahora después de agregarlo a la lista de precarga de hsts.
puede ver la redirección interna 307 allí en los encabezados de respuesta, en realidad esta respuesta es generada por su navegador y no por el servidor.
Además, la lista de precarga de HSTS puede ayudar a evitar que los usuarios lleguen a la versión no segura del sitio, ya que la redirección 302 es propensa a ataques mitm.
Espero haberte ayudado a entender más acerca de las redirecciones.
fuente
Originalmente solo había
302
La idea es que:
GET
en algún lugar, volvería a hacer suGET
a la nueva URLPOST
en algún lugar, volvería a hacer suPOST
a la nueva URLPUT
en algún lugar, volvería a hacer suPUT
a la nueva URLDELETE
en algún lugar, volvería a hacer suDELETE
a la nueva URLLamentablemente, todos los navegadores lo hicieron mal. Al obtener un
302
, siempre cambiarían aGET
la nueva URL, en lugar de volver a intentar la solicitud con el mismo verbo ( por ejemplo ,POST
):Se volvió de facto incorrecto.
Todos los navegadores se
302
equivocaron. Así303
y307
fueron creados.El | Respuesta | ¿Qué deberían hacer los navegadores? Lo que realmente hacen los navegadores | | ------------------------ | ------------------------ --- | --------------------------- | El | 302 encontrado | Rehacer solicitud con nueva url | OBTENER con nueva url | El | 303 Ver otros | OBTENER con nueva url | OBTENER con nueva url | El | Redirección temporal 307 | Rehacer solicitud con nueva url | Rehacer solicitud con nueva url |
En forma de cuadro
Los 5 tipos diferentes de redireccionamientos:
Alternativamente:
fuente
Además, para los administradores del servidor, puede ser importante tener en cuenta que los navegadores pueden presentar un aviso al usuario si utiliza la redirección 307.
Por ejemplo *, Firefox y Opera le pedirían al usuario permiso para redirigir, mientras que Chrome, IE y Safari lo harían de forma transparente.
* según Bulletproof SSL y TLS (página 192).
fuente
En algunos casos de uso, un atacante puede abusar de las redirecciones 307 para conocer las credenciales de la víctima.
Se puede encontrar más información en la sección 3.1 de Un análisis integral de seguridad formal de OAuth 2.0 .
Los autores del artículo anterior sugieren lo siguiente:
fuente