No hash enlace de confirmación de registro de correo electrónico

7

He enviado correos electrónicos que contienen un enlace de confirmación de registro de correo electrónico:

http://example.com?create=email%3Djay%40gmail.com%26confirm_key%3D53e321f97c145

No hash el enlace de arriba. Antes de enviar un correo electrónico con este enlace, el usuario se registró como nuevo miembro. La dirección de correo electrónico se inserta como un nuevo registro en la base de datos junto con un confirm_key .

Entonces, en mi base de datos hay dos campos que primero se llenan email y confirm_key . El confirm_key es generado por la función PHP uniqid() .

Mi pregunta es, ¿cuáles son los riesgos de seguridad en el uso de este método, en su caso?

    
pregunta Lim Guang Jian 06.08.2014 - 19:42
fuente

3 respuestas

1

uniqid() no crea un hash criptográficamente seguro, y el envío de datos confidenciales a través de canales de texto plano como el correo electrónico o http significa que cualquier persona intermedia puede leerlos.

¿Esto es un problema? No, en realidad no (con la excepción establecida en el último párrafo).

La información que envías consiste en la dirección de correo electrónico del usuario y una clave de confirmación. Esto también es lo que está almacenado en la base de datos. No hay forma de enviar un correo electrónico sin revelar la dirección de correo electrónico del destinatario, por lo que transmitir esa dirección en texto sin formato como parte de una URL tampoco es un problema. Si algún Gran Mal va a suceder, entonces ya ha sucedido.

Ahora, ¿qué pasa con la clave de confirmación?

Podrías estar dando enteros consecutivos como claves de confirmación (¡en realidad uniqid() no está muy lejos de eso!), y no importaría. Una persona malintencionada podría interceptar la clave de otra persona o podrían generar su propia cuenta de forma trivial, pero ninguna de ellas le permitirá registrar una cuenta falsa, ya que la consulta de la base de datos busca el par < username, confirm_key & gt ;. Una clave de confirmación robada o aleatoria / falsa / calculada, por lo tanto, no funciona con otro nombre de usuario (aleatorio), no tiene valor para un atacante.

El único ataque que es razonablemente plausible es que alguien pueda interceptar su correo electrónico y confirmar su cuenta legítima con la dirección de correo electrónico y la clave de confirmación correctas antes de poder hacerlo.
De hecho, esto es un problema si su sistema está diseñado para que la confirmación de una cuenta de usuario también lo inicie automáticamente en su primera sesión (¡algunos sitios hacen eso mismo!).

    
respondido por el Damon 07.08.2014 - 13:39
fuente
10

El único problema es que está filtrando información, en este caso, la dirección de correo electrónico del usuario. Dado que está en texto simple en la cadena de consulta, será almacenado por cualquier registro que ocurra en cualquier lugar entre el cliente y su servidor, posiblemente en marcadores si el usuario marca esa página, si la URL se copia y almacena o envía a alguien, etc. / p>

También señalaré que cualquier cosa que hagas será vulnerable a la inhalación, ya que estás usando HTTP en lugar de HTTPS.

    
respondido por el Xander 06.08.2014 - 19:54
fuente
7

uniqid() no debe usarse para nada relacionado con la seguridad:

  

Esta función no crea cadenas aleatorias ni impredecibles. Esta función no debe ser utilizada por razones de seguridad. Utilice una función / generador aleatorio criptográficamente seguro y funciones hash criptográficamente seguras para crear IDs impredecibles.

Además, debe hacer que su enlace sea HTTPS en lugar de HTTP simple para protegerse contra MITM ataca y para evitar cualquier almacenamiento en caché por los servidores proxy.

Podría ser mejor enviar confirm_key solo como el enlace enviado por correo electrónico, y luego pedirle al usuario que inicie sesión para asociar la dirección de correo electrónico a la cuenta. Esto confirmará que solo el usuario registrado realmente está iniciando sesión para confirmar la cuenta en lugar de cualquier otra persona que pueda acceder al enlace de registro.

    
respondido por el SilverlightFox 06.08.2014 - 20:32
fuente

Lea otras preguntas en las etiquetas