Usar user_activation_key para otros propósitos

28 oct 2012, 10:11:16
Vistas: 32.2K
Votos: 6

Necesito saber si es seguro usar user_activation_key (de WP_User) para otro propósito como la verificación de correo electrónico (una funcionalidad que estaría creando que enviaría una verificación de correo electrónico antes de activar la cuenta creada).

Así es como funcionarán las cosas. Un usuario se registrará usando mi formulario de registro personalizado que estará disponible solo en el front-end. Después de un registro exitoso, el usuario será notificado por correo electrónico que la cuenta ha sido creada junto con el enlace de activación que se crea durante el registro usando la siguiente convención:

http://www.example.com/verify/?key=SAMPLEACTIVATIONKEY4321

¿Crees que esto será seguro?

0
Todas las respuestas a la pregunta 2
2

¿Crees que esto será seguro?

Quizás. Dos problemas.

También necesitas asegurarte de que la clave no sea adivinable. Nada de números incrementales. Puedes usar algo como wp_generate_password para obtener caracteres pseudoaleatorios. Usa una "sal" aleatoria más el correo del usuario y el tiempo de registro o uniqid y tendrás una buena probabilidad de asegurar unicidad (ver abajo) y crear una clave no adivinable.

$user_email = alguna_funcion_para_obtener_email_usuario();
$salt = wp_generate_password(20); // Cadena "aleatoria" de 20 caracteres
$key = sha1($salt . $user_email . uniqid(time(), true));

También necesitarás asegurar la unicidad de la clave: no debería haber colisiones.

No hay restricciones en la columna user_activation_key de la base de datos que aseguren la unicidad, así que depende de tu aplicación (ej. WordPress y el lado PHP) asegurarlo. En otras palabras, ya sea antes o después de generar la clave, asegúrate de que no exista ya en la base de datos. Ejemplo simple no probado:

<?php
$key = alguna_funcion_que_genera_una_clave();
$res = $wpdb->get_col($wpdb->prepare("SELECT EXISTS(SELECT 1 FROM {$wpdb->users} WHERE user_activation_key = %s)", $key));
if ($res) {
    // la clave existe, ¡intenta de nuevo!
} else {
    // todo listo.
}

Si necesitas una guía, intenta ver cómo WordPress maneja los correos de restablecimiento de contraseña. El proceso es el mismo: generar una clave no adivinable, asegurar que sea única, insertarla en la base de datos con el usuario correspondiente, y luego enviarles un correo con un enlace para restablecer la contraseña.

27 ene 2013 06:57:57
Comentarios

Gracias por esa maravillosa respuesta. (Sé que la respuesta fue tardía, ¡jaja! Pero esta es realmente útil).

mcometa mcometa
18 sept 2013 12:14:58

O si no quieres preocuparte por colisiones, simplemente pasa también el ID de usuario en la solicitud de verificación

Tofandel Tofandel
24 feb 2019 18:03:51
3

No, no es seguro porque cualquiera puede usarlo. Pero si puedes proporcionar tu ID de correo electrónico, entonces se te puede referir a una clave o número de activación específico, lo que lo hace seguro.

28 oct 2012 10:33:36
Comentarios

Hola @Ajay, edité mi pregunta para incluir más detalles. Por favor revisa de nuevo ya que no entendí a qué te referías con "alguien use esto".

mcometa mcometa
28 oct 2012 11:05:39

Creo que lo que quiere decir es que debe ser más específico para el usuario cuya clave de activación es. Esto evitará que individuos usen métodos de fuerza bruta para acceder a la cuenta de otra persona.

Ollie Ollie
28 oct 2012 14:20:24

@Ollie me aseguré de que la clave de activación se envíe a la dirección de correo del usuario que intenta registrarse. Además, la clave de activación contiene un valor cifrado del nombre de usuario, contraseña y marca de tiempo. ¿Estoy haciendo lo correcto? Soy algo nuevo en estos temas con Wordpress.

mcometa mcometa
28 oct 2012 15:33:29