Editar para responder una pregunta real
Perdón por malinterpretar tu pregunta. Dicho esto, aquí hay una respuesta. Si su objetivo es lograr que nadie sepa qué direcciones de correo electrónico ha registrado en el sistema (lo que es un buen objetivo), la respuesta simple es que usted no puede verificar de antemano si Se toma la dirección de correo electrónico, y luego hágales saber si es así. Independientemente de las medidas de seguridad que adopte, seguirá teniendo un lugar donde la gente puede preguntar "¿está esta persona en su sitio?". Incluso la limitación de la velocidad realmente no lo hace, ya que un atacante malicioso podría estar apuntando a un usuario específico. Si ya conocen de antemano la dirección de correo electrónico de la persona, solo tienen que ir a su formulario de registro y ver si el correo electrónico ha sido recibido. En su lugar, tendrá que ajustar su paso de registro:
- Siempre puedes validar que se trata de una dirección de correo electrónico real (indicándoles que la dirección de correo electrónico no es una dirección de correo electrónico que protegerá contra errores tipográficos y, obviamente, no revelará nada sensible).
- Haga que escriban la dirección de correo electrónico dos veces: esto ayudará a evitar errores tipográficos, lo que será una gran ayuda en el próximo paso:
- Forzar al usuario a través de un proceso de validación de correo electrónico, como lo describo a continuación: enviarles un correo electrónico con una clave que deben usar para activar su cuenta. Esto proporciona un par de capas de protección. Si alguien está utilizando su formulario de registro para rastrear las direcciones de correo electrónico usadas, no se enterará de nada. En todos los casos, su formulario de registro devuelve un mensaje genérico "Consulte su correo electrónico para obtener instrucciones sobre cómo activar su cuenta". Si la dirección de correo electrónico ya existe, entonces, en lugar de enviar instrucciones de activación, puede enviar un "Usted acaba de intentar registrarse pero ya existe en nuestro sistema. Haga clic aquí para recuperar su contraseña. Si no intentó registrarse, haga clic aquí vincula y luego ignora este mensaje "(o algo así). De lo contrario, haga el mensaje de validación de correo electrónico normal.
Ya que no quiere decirle a la gente si intenta registrarse con un correo electrónico que ya existe, recibirá tres personas diferentes que envían su formulario de registro:
- Personas nuevas que intentan registrarse (estas personas no tendrán ningún problema)
- Personas mayores que ya están registradas pero se olvidaron: su correo electrónico alternativo les ayudará a ingresar muy rápidamente.
- Personas que intentan eliminar tu lista de correo electrónico. No obtendrán nada en absoluto.
Como resultado, los actores malintencionados se excluirán y sus usuarios legítimos se comunicarán sin problemas. Una buena combinación entre usabilidad y seguridad (IMO).
respuesta anterior: ligeramente aplicable
La validación correcta del correo electrónico no debería permitir que alguien pueda verificar la existencia de direcciones de correo electrónico en su sistema. Es posible que deba incluir más detalles sobre lo que está haciendo exactamente. Dicho esto, siempre vale la pena explicar cuál debería ser la respuesta :
La validación del correo electrónico se debe realizar mediante una clave criptográfica segura y aleatoria que se envíe por correo electrónico al usuario. En ese momento, la validación puede ser tan simple como hacer clic en un enlace que le envía al usuario que tiene el siguiente aspecto:
https://example.com/verify_registration?key=LONGANDRANDOMSTRING
Cosas a tener en cuenta:
- Asegúrese de que la clave de validación se genere con un CSPRNG adecuado: si el usuario puede adivinar la clave a partir de su entrada, es inútil.
- La dirección de correo electrónico del usuario no es parte de la entrada y no es necesaria en ningún paso del proceso de validación. El hecho de que el usuario conozca la clave aleatoria, que solo se entrega por correo electrónico, es lo que verifica que el usuario posee la dirección de correo electrónico. Como resultado, no debería haber ninguna oportunidad para que las personas eliminen una lista de direcciones de correo electrónico.
- Asegúrese de que su clave tenga suficientes bytes aleatorios que no pueda ser adivinado
- Normalmente, solo usaría las solicitudes de
POST
para realizar cambios y, por lo tanto, desea asegurarse de que este punto final tenga protección CSRF. Sin embargo, eso no es necesario aquí. La razón es que la clave en sí misma es lo suficientemente aleatoria como para que nadie, excepto la persona con el correo electrónico, la tenga de todos modos. Así que es mejor hacer que el proceso de validación se realice a través de un enlace simple y una solicitud GET
. Incluso si el usuario solo tiene que copiar y pegar la clave de su correo electrónico a un formulario web, alguien se equivocará. La forma en que funciona es lo suficientemente simple y lo suficientemente segura como para que (IMO) una IU más simple sea perfectamente razonable.
- Vale la pena mencionarlo porque lo veo todo el tiempo: los hashes no agregan aleatoriedad a una cadena. Utilice un CSPRNG real para hacer la cadena aleatoria. No se limite a tomar algunos datos simples y hash. Los hash no agregan entropía: deben hacer que se vea al azar.