¿Hay algún error en particular al poner un código de autenticación en los correos electrónicos de marketing?

0

He estado trabajando en mi primer proyecto, y mis usuarios registrados iniciales no han sido particularmente pegajosos. Me gustaría enviarles un correo electrónico con algunas noticias e información y hacer que inicien sesión de forma instantánea cuando pulsen el enlace de llamada a la acción. Estaba pensando en generar un código de autenticación con random_bytes() de PHP y almacenarlo en una tabla con su correspondiente user_id .

Básicamente, el correo electrónico sería:

  

Hey oldUser2017, newUser2018 te envió un mensaje. Haga clic en <a href="http://mysortofokproject.com/message/20992?authCode=657f8b8da628ef83cf69101b6817150>here</a>   para verlo al instante y ni siquiera tener que iniciar sesión o restablecer su contraseña   o algo molesto!

Y en el backend

userId = getUserIdFromAuthCode($get['authCode'])
if(userId){
 $session = getUserDetailsFromUserId(userId)
}

Dado que así es como autentificamos una dirección de correo electrónico y activamos una cuenta:

  1. ¿Qué sería tan malo si yo hiciera esto?
  2. ¿Es random_bytes() de PHP lo suficientemente bueno, y qué longitud usaría?
  3. ¿Debería caducar?
pregunta user3238414 21.08.2018 - 02:52
fuente

3 respuestas

0

No creo que esta sea una buena idea. Primero, los correos electrónicos se envían en texto sin formato, lo que significa que no son seguros ni privados. Aunque algunos de los saltos pueden estar cifrados con TLS (sin garantías), en la actualidad es bastante fácil para un nodo en la ruta a MITM el correo electrónico de todos modos, o para cualquiera de los servidores intermedios (o puntos finales) leer el correo electrónico de texto sin formato. Esto es muy similar a enviar una contraseña de usuario por correo electrónico y es una mala idea.

También su ejemplo utiliza http y no https, por lo que perderá esta contraseña en los registros del servidor y para cualquier persona que controle pasivamente la red.

Más importante aún, esto omite completamente su código de inicio de sesión, lo que agrega más vulnerabilidades de seguridad potenciales. Por ejemplo, es probable que limites el número de intentos de inicio de sesión, pero ¿también limitas el número de intentos de inicio de sesión con estas nuevas contraseñas secundarias que estás generando?

Si decidiste hacer esto, el código definitivamente caducará después de que el usuario siga el enlace, o después de un corto período de tiempo. Sería mejor no iniciar sesión en el usuario y tal vez usar este código para mostrar el mensaje solamente (aunque probablemente no sea una buena idea).

    
respondido por el Steve 21.08.2018 - 05:03
fuente
0

Propuesta: ¿Qué sucede si crea una página y un servicio por separado que muestra el mensaje a un usuario que sigue ese enlace, pero luego invalida ese authCode, de modo que solo se puede usar una vez? (También puede establecer un límite de tiempo en su validez).

Esto le permitirá mostrar el mensaje sin problemas, mientras mantiene a sus usuarios seguros. Siempre puede proporcionar un formulario para iniciar sesión (o restablecer una contraseña) debajo del mensaje en la misma página; Si su usuario ya está en esa página y ha accedido a él desde un enlace en su correo electrónico, es probable que el trabajo adicional requerido para que realmente se conecte sea mínimo.

¿Quizás pueda retener a más usuarios de esta manera sin burlar por completo su seguridad?

    
respondido por el Kjartan 20.09.2018 - 10:50
fuente
0

No puedo hablar por PHP, pero

  
  1. ¿Qué sería tan malo si yo hiciera esto?
  2.   

Muchos sitios web utilizan códigos hash incrustados en un enlace para averiguar dónde enviar a los usuarios una vez que hacen clic en un enlace. Sin embargo, enviar un código de autenticación es bastante arriesgado. Por supuesto, si sigue las buenas prácticas y se asegura de que las conexiones entre su servidor, su servidor de correo y el servidor de correo del destinatario estén cifradas, no necesariamente sabrá si el destinatario tiene una conexión cifrada entre su servidor de correo y el cliente que sea. ella usa.

Y esta es una suposición central que debes hacer: los usuarios son tontos. Pueden desmarcar "Usar SSL / TLS" en Thunderbird porque no saben lo que hace. Podrían reenviar el correo electrónico equivocado a la persona equivocada. Minimice el riesgo y trate de no enviar códigos de autenticación a menos que tenga que (absolutamente, pensar en la recuperación de la contraseña).

Para leer mensajes u otra información trivial, generalmente es mejor dejar que el usuario se autentique una vez que llega a la página de destino.

  
  1. ¿Debería caducar?
  2.   

Sí, definitivamente. Si decide enviar códigos de autenticación, entonces haga que caduque dentro de unas pocas horas (¡o quizás 30 minutos o menos, incluso!) Si envía códigos de enlace que redirigen a los usuarios para que se autentiquen en su servidor, entonces la fecha de vencimiento podría establecerse aún más porque hay menos posibilidades de fugas de información de autenticación.

    
respondido por el ideaman924 20.09.2018 - 11:55
fuente

Lea otras preguntas en las etiquetas