¿Es segura una cadena de consulta HTTPS?

351

Estoy creando una API segura basada en web que usa HTTPS; sin embargo, si permito que los usuarios lo configuren (incluido el envío de contraseña) usando una cadena de consulta, ¿esto también será seguro o debería forzarlo a hacerlo a través de una POST?

Juan
fuente

Respuestas:

453

Sí lo es. Pero usar GET para datos confidenciales es una mala idea por varias razones:

  • Principalmente fuga de referencia HTTP (una imagen externa en la página de destino podría filtrar la contraseña [1])
  • La contraseña se almacenará en los registros del servidor (que obviamente es malo)
  • Cachés de historial en navegadores

Por lo tanto, a pesar de que Querystring está protegido, no se recomienda transferir datos confidenciales a través de la cadena de consulta.

[1] Aunque debo tener en cuenta que RFC establece que el navegador no debe enviar referencias desde HTTPS a HTTP. Pero eso no significa que una barra de herramientas del navegador de terceros o una imagen / flash externo de un sitio HTTPS no lo filtre.

dr. mal
fuente
44
¿Qué pasa con las referencias https a https ? Si obtengo una imagen de un sitio de terceros usando https? ¿El navegador enviará la cadena de consulta completa de mi solicitud anterior al servidor de terceros?
Jus12
44
@ Jus12 sí, no tiene sentido, pero así es como está diseñado.
dr. mal
2
Entonces, ¿por qué esa especificación OAuth2 no se recomienda para enviar datos confidenciales en los parámetros de consulta (en la URL)? Aunque se recomienda usar TLS (HTTPS) siempre. Consulte el último punto en tools.ietf.org/html/draft-ietf-oauth-v2-bearer-16#section-4.3 CC @volka
gihanchanuka el
@ dr.evil ¿Podría explicar cuál es el problema History caches in browserso agregar alguna referencia para ir?
LCJ
1
Para completar esa respuesta con información actualizada: securitynewspaper.com/2016/08/01/… (El hack Proxy PAC permite la intercepción de URL HTTPS)
Tom
78

Desde el punto de vista de "olfatear el paquete de red", una solicitud GET es segura, ya que el navegador primero establecerá la conexión segura y luego enviará la solicitud que contiene los parámetros GET. Pero las URL de GET se almacenarán en el historial / autocompletado del navegador del usuario, que no es un buen lugar para almacenar, por ejemplo, datos de contraseña. Por supuesto, esto solo se aplica si toma la definición más amplia de "Servicio web" que podría acceder al servicio desde un navegador, Si accede solo desde su aplicación personalizada, esto no debería ser un problema.

Por lo tanto, se debe preferir usar la publicación al menos para los diálogos de contraseña. Además, como se señaló en el enlace que littlegeek publicó, es más probable que se escriba una URL GET en los registros de su servidor.

VolkA
fuente
48

, sus cadenas de consulta serán encriptadas.

La razón detrás es que las cadenas de consulta son parte del protocolo HTTP, que es un protocolo de capa de aplicación, mientras que la parte de seguridad (SSL / TLS) proviene de la capa de transporte. La conexión SSL se establece primero y luego los parámetros de consulta (que pertenecen al protocolo HTTP) se envían al servidor.

Al establecer una conexión SSL, su cliente realizará los siguientes pasos en orden. Suponga que está intentando iniciar sesión en un sitio llamado example.com y desea enviar sus credenciales utilizando parámetros de consulta. Su URL completa puede tener el siguiente aspecto:

https://example.com/login?username=alice&password=12345)
  1. Su cliente (p. Ej., Navegador / aplicación móvil) primero resolverá su nombre de dominio example.coma una dirección IP (124.21.12.31)mediante una solicitud de DNS. Al consultar esa información, solo se usa información específica del dominio, es decir, solo example.comse usará.
  2. Ahora, su cliente intentará conectarse al servidor con la dirección IP 124.21.12.31e intentará conectarse al puerto 443 (el puerto de servicio SSL no es el puerto HTTP predeterminado 80).
  3. Ahora, el servidor example.comenviará sus certificados a su cliente.
  4. Su cliente verificará los certificados y comenzará a intercambiar una clave secreta compartida para su sesión.
  5. Después de establecer con éxito una conexión segura, solo entonces sus parámetros de consulta se enviarán a través de la conexión segura.

Por lo tanto, no expondrá datos confidenciales. Sin embargo, enviar sus credenciales a través de una sesión HTTPS utilizando este método no es la mejor manera. Deberías optar por un enfoque diferente.

Ruchira Randana
fuente
2
Pero mira la respuesta de @dr. mal, la cadena de cantera puede terminar en archivos de registro y cachés, por lo que puede no ser segura en el servidor.
zaph
3
Hola zaph, en términos de seguridad HTTPS, el objetivo es enviar datos de forma segura al servidor sin que nadie en el medio pueda rastrear los datos. Si bien eso es posible y responde a la pregunta, es realmente difícil controlar lo que el servidor hace después. Es por eso que también he mencionado que esta no es la forma correcta. Además de eso, nunca debe enviar su contraseña desde el cliente. Siempre debe usar hash en el dispositivo y enviar el valor hash al servidor.
Ruchira Randana
Desde el punto de vista de la seguridad, el envío de información confidencial en la cadena de la cantera no es seguro, lo mejor es enviarlo en una POST. Además, la contraseña generalmente está cifrada en el servidor, no por el cliente. La afirmación "nunca se debe enviar ur contraseña desde el cliente" está en conflicto con la respuesta: (e.g http://example.com/login?username=alice&password=12345).
zaph
El hash de @RuchiraRandana en el cliente no tiene sentido porque la clave privada se recupera fácilmente desde el front-end.
James W
@JamesW " la clave privada se recupera fácilmente desde la interfaz " ¿Qué clave?
curioso
28

Si. El texto completo de una sesión HTTPS está protegido por SSL. Eso incluye la consulta y los encabezados. En ese sentido, un POST y un GET serían exactamente lo mismo.

En cuanto a la seguridad de su método, no hay una forma real de decirlo sin una inspección adecuada.

shoosh
fuente
27
Hay más en seguridad que solo la comunicación entre el navegador y el servidor
JoeBloggs
26

SSL se conecta primero al host, por lo que el nombre del host y el número de puerto se transfieren como texto sin cifrar. Cuando el host responde y el desafío tiene éxito, el cliente cifrará la solicitud HTTP con la URL real (es decir, cualquier cosa después de la tercera barra oblicua) y la enviará al servidor.

Hay varias formas de romper esta seguridad.

Es posible configurar un proxy para que actúe como un "hombre en el medio". Básicamente, el navegador envía la solicitud para conectarse al servidor real al proxy. Si el proxy se configura de esta manera, se conectará a través de SSL al servidor real, pero el navegador seguirá hablando con el proxy. Entonces, si un atacante puede obtener acceso al proxy, puede ver todos los datos que fluyen a través de él en texto claro.

Sus solicitudes también serán visibles en el historial del navegador. Los usuarios pueden verse tentados a marcar el sitio. Algunos usuarios tienen instaladas herramientas de sincronización de marcadores, por lo que la contraseña podría terminar en deli.ci.us o en algún otro lugar.

Por último, alguien podría haber pirateado su computadora e instalado un registrador de teclado o un raspador de pantalla (y muchos virus del tipo Trojan Horse lo hacen). Dado que la contraseña es visible directamente en la pantalla (a diferencia de "*" en un diálogo de contraseña), este es otro agujero de seguridad.

Conclusión: cuando se trata de seguridad, siempre confíe en el camino trillado. Hay demasiadas cosas que no sabes, que no pensarás y que te romperán el cuello.

Aaron Digulla
fuente
3
"el navegador seguirá hablando con el proxy" no es del todo cierto, tendrá que presentar al navegador un certificado válido que el proxy solo puede generar si tiene control sobre una CA en la que el navegador confía.
Pieter
11

Sí, siempre y cuando nadie mire por encima del hombro el monitor.

Ali Afshar
fuente
13
y su navegador no guarda el historial :)
Rahul Prasad
10

No estoy de acuerdo con la afirmación sobre [...] la fuga del referente HTTP (una imagen externa en la página de destino podría filtrar la contraseña) en la respuesta de Slough .

El HTTP 1.1 RFC declara explícitamente :

Los clientes NO DEBEN incluir un campo de encabezado Referer en una solicitud HTTP (no segura) si la página de referencia se transfirió con un protocolo seguro.

De todos modos, los registros del servidor y el historial del navegador son razones más que suficientes para no poner datos confidenciales en la cadena de consulta.

Arnout
fuente
2
Ahí está esa palabra 'debería' nuevamente. ¿Confiarías en cada versión de cada navegador con tu contraseña?
JoeBloggs
1
¿Cómo se relaciona exactamente esto con GET vs POST? ¿Sería seguro "todas las versiones de cada navegador" si utiliza POST sobre HTTPS?
Arnout
2
Además, la página web HTTPS podría ser retreiving una imagen externa a través de HTTPS - en cuyo caso, el navegador debe incluir la cabecera árbitro, y así exponer su contraseña ...
Avid
3
@Arnout: Lea este RFC que le dice lo que NO DEBE significar: ietf.org/rfc/rfc2119.txt NO es lo mismo que NO DEBE, por lo que la parte que citó no es realmente relevante y los agentes del navegador aún pueden incluir un árbitro a HTTP.
Andy
8

Sí, desde el momento en que establezca una conexión HTTPS todo es seguro. La cadena de consulta (GET) como POST se envía a través de SSL.

Drejc
fuente
-4

Puede enviar la contraseña como MD5 hash param con un poco de sal agregada. Compárelo en el lado del servidor para la autenticación.

Amareswar
fuente
11
MD5 no es una función hash adecuada para contraseñas.
Slawek
1
Ya sea en hash o en texto sin formato, es una mala práctica enviar contraseñas dentro de los parámetros GET. Consulte la respuesta más votada para obtener explicaciones. Aaaand ... MD5 ya no debería usarse en ningún lugar ...
Thomas
" Función hash no adecuada para contraseñas " Aún mejor que enviar contraseñas en texto sin formato al servidor, jajaja
curiosoguy