Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Atacando Aplicaciones, APIs, Apps Móviles, Servidores Redes, Dispositivos IoT
SCI: Sistemas de Control Industrial
COS: Centro de Operaciones de Seguridad

Validar Propietario de Cuenta de Correo

Nuestros ethical hackers explican cómo verificar la propiedad de un correo electrónico mediante el uso de identificadores únicos aleatorios para la verificación de propiedad de un correo electrónico en aplicaciones que utilicen registro de usuarios.

Necesidad

Garantizar que un usuario es realmente el poseedor de una cuenta de correo

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se está usando el lenguaje de programación C#.

  2. Se está desarrollando una aplicación que soporta registro de usuarios.

  3. Se conoce previamente como generar códigos aleatorios universalmente únicos.

  4. De lo contrario, ver Generar Identificador Universalmente Único

Solución

  1. Una vez un usuario se registra en la aplicación, se debe comprobar que el correo electrónico que ingresó en realidad es de su propiedad antes de proceder a activar su cuenta. Para lograrlo, se envía a esa dirección un código aleatorio que el usuario deberá ingresar en la aplicación. Un mecanismo común en aplicaciones web es incluir un enlace que contiene el código para evitar que el usuario tenga que ingresarlo manualmente. A continuación se muestra como implementar el mecanismo. Primero se utilizarán los espacios de nombre System.Net y System.Net.Mail que contienen las clases para el envío de correos.

    ejemplo.cs
    1
    2
    3
    using System;
    using System.Net;
    using System.Net.Mail;
    
  2. Se inicializan los datos básicos del mensaje a enviar

    1
    2
    3
    4
    5
    6
    7
    8
    namespace LineaBase {
      class Program {
        static void Main(string[] args) {
          try {
            var direccionOrigen = new MailAddress("origen@gmail.com", "Remitente de prueba");
            var direccionDestino = new MailAddress("destino@gmail.com", "Destinatario de prueba");
            const string clave = "miclave";
            const string asunto = "Asunto de prueba";
    
  3. Se crea el mensaje a enviar, generando el código aleatorio mediante el método NewGuid de la clase System.Guid. El símbolo @ se utiliza para crear fácilmente una cadena de texto multilínea, como lo es el caso del mensaje.

    1
    2
    3
    4
    5
            string cuerpo = @"
            Bienvenido/a al sistema, usuario <nombre_de_usuario>.
            Para poder acceder a su nueva cuenta debe verificar su correo
            haciendo click en el siguiente enlace:
            http://www.pagina.com/ID=" + System.Guid.NewGuid().ToString();
    
  4. Se crea una nueva instancia de MailMessage con los valores definidos anteriormente. Se utiliza using para el liberado automático de recursos.

    1
    2
    3
    4
            using (MailMessage mensaje = new MailMessage(direccionOrigen, direccionDestino) {
              Subject = asunto,
              Body = cuerpo
            })
    
  5. Se crea una instancia de la clase SmtpClient inicializando esta con los datos requeridos por el servidor de correos, incluyendo las credenciales de acceso. En este caso se utilizará el servidor SMTP de Gmail.

    1
    2
    3
    4
    5
    6
    7
    8
    9
            {
              using (var smtp = new SmtpClient() {
                Host = "smtp.gmail.com",
                Port = 587,
                EnableSsl = true,
                DeliveryMethod = SmtpDeliveryMethod.Network,
                Credentials = new NetworkCredential(direccionOrigen.Address, clave),
                Timeout = 18000
              })
    
  6. Se envía el mensaje ya construido utilizando el cliente recién creado.

    1
    2
    3
    4
              {
                smtp.Send(mensaje);
              }
            }
    
  7. Finalmente se hace un manejo de excepciones básico.

    1
    2
    3
    4
    5
    6
          } catch (SmtpException) {
              Console.WriteLine("El mensaje no ha podido ser enviado");
          }
        }
      }
    }
    
  8. Se observa el mensaje una vez llega al usuario:

    Correo de verificación del propietario del correo.
  9. En este caso el modo de ingresar el código a la aplicación es mediante el método GET de HTTP, por lo cual se incluye directamente en la URL. Para finalizar, la parte de la aplicación encargada del registro deberá validar que dicho código se introduzca antes de cierto límite de tiempo para proceder a activar el usuario.

Descargas

Puedes descargar el código fuente pulsando en el siguiente enlace:

  1. ejemplo.cs contiene todas las instrucciones C# del programa.




Haz un comentario

Estado de los servicios - Términos de Uso