Sistema de inicio de sesión basado en la base de datos SOAP

0

Recientemente, he tenido el desafío de crear un marco de inicio de sesión que contenga los datos del usuario en una base de datos independiente que conecto a través de una conexión SOAP. Ahora, he hecho algo en este sentido antes de usar solo MySQL.

Ahora para encontrar el sistema de inicio de sesión, almaceno la información del usuario devuelta en $_SESSION variables; Devuelven la contraseña en texto sin formato (junto con otra información), sin saber por qué, sin embargo, no almaceno esa contraseña en texto sin formato; más bien cifro la contraseña con una clave única para cada usuario.

Para verificar si el usuario está conectado actualmente, utilizo sus sesiones usando 2 parámetros diferentes agrupados y comparados con el logged_in__string que se realiza al iniciar sesión; Esta es la configuración básica:

$_SESSION['logged_in__string'] = hash ( 'sha512', 'USER_PASSWORD' . $_SERVER['HTTP_USER_AGENT'] );

Después de crear eso, cifro la contraseña usando una clave única para cada usuario; Luego cree una nueva función, check() que descifre la contraseña, y cree el valor de hash, compárelo con el $_SESSION['logged_in__string'] y si es igual, el usuario inicia sesión.

Mi interés está en las variables $_SESSION . ¿Cuáles son algunos riesgos potenciales en el enfoque que he tomado, y si hay alguno, cuáles son algunos buenos métodos para asegurar estas sesiones para el usuario?

    
pregunta Samuel 26.10.2017 - 23:04
fuente

1 respuesta

2

hash tus contraseñas

En primer lugar, parece que la base de datos almacena la contraseña en texto sin formato. Eso es muy, muy, muy malo. Consulte esta pregunta para saber cómo hacerlo correctamente.

El problema con tu sistema

Ahora, a tu pregunta actual. El objetivo de su sistema es detener el secuestro de sesión. Sin embargo, no hace nada por el estilo. Si robo una de las cookies de sesión de sus usuarios y la envío en una solicitud a su servidor, ¿cómo sabría que fue robada? Todo lo que hace su sistema es descifrar la contraseña que el usuario real proporcionó al iniciar sesión y verificar que sea correcta, lo que siempre será. Básicamente, su sistema se reduce a verificar ese password = password con algo de "polvo criptográfico mágico esparcido encima" (para citar Androl Genhald ).

Para ver esto, escriba su sistema en pseudocódigo simplificado y luego analice cómo se comportaría el servidor en caso de un ataque con lápiz y papel. Me parece que es una técnica útil para problemas como este.

Un poco más allá del punto, pero: solo usar una ronda de SHA-256 no es suficiente para las contraseñas de hash. Y almacenar los datos cifrados y la clave en el mismo lugar no es una buena idea.

La solución

Mantenlo simple:

$_SESSION['logged_in'] = true

Luego, para protegerse contra el secuestro de sesiones, puede hacer lo siguiente:

  • Use un buen HTTPS.
  • Asegúrese de que sus ID de sesión tengan suficiente entropía.
  • Marque la cookie de sesión como segura y solo para HTTP.
  • Cuidado con XSS.

Su sistema también se asegura de que el agente de usuario permanezca constante durante una sesión. Esto es solo una protección limitada, ya que el agente de usuario puede ser fácilmente falsificado, pero puede ayudar contra un atacante no sofisticado. Si desea mantener esa comprobación, simplemente almacene el agente de usuario original en la sesión y luego, en cada solicitud, compruebe que el encabezado del agente de usuario sea el mismo que el que ha almacenado.

    
respondido por el Anders 27.10.2017 - 09:49
fuente

Lea otras preguntas en las etiquetas