Proceso de registro y envío de link por email – Como validar el link

publicado por: Anonymous

Tengo un formulario de registro, hecho en PDO, y cuando todo el proceso de registro está realizado, por último “armo” un mail que envío al correo electrónico donde le envío un link para terminar el proceso de registro. Hasta ahí todo bárbaro, pero me dejaron medio paranoico con el tema de seguridad y yo hasta el momento tenía este pedazo de código para formar el link de activación:

$url = 'http://'.$_SERVER["SERVER_NAME"].'/forms/activacion/activa.php?id='.$registro.'&val='.$token;

En $registro guardo el nuevo código de usuario con el que está almacenado en la base. En $token paso una cadena generada con md5 como para darle mas seguridad.
Como se darán cuenta en activa.php hago la validación con

  if(isset($_GET["id"]) AND isset($_GET['val'])) {  
    $idUsuario = $_GET['id'];
    $token = $_GET['val'];
    $mensaje = validaIdToken($idUsuario, $token);
  }

en validaToken hago algo asi (por si les interesa)

function validaIdToken($id, $token){

    $conexion = new Conexion();
    $stmt = $conexion -> prepare("SELECT activacion FROM usuarios WHERE id = :valor AND token = :token LIMIT 1");
    $stmt->bindParam(':valor', $id);
    $stmt->bindParam(':token', $token);
    $stmt->execute();

    $resultado = $stmt->fetch(PDO::FETCH_ASSOC);

    if ($stmt->rowCount() > 0) {
        if ($resultado['activacion'] == 1) {
            $msg = "La cuenta ya se activo anteriormente.";
        } else {
            if(activarUsuario($id)){
                $msg = 'Cuenta activada.';
                } else {
                $msg = 'Error al Activar Cuenta';
            }
        }
        } else {
        $msg = 'No existe el registro para activar.';
    }
    return $msg;

   }

Resumiendo: estoy queriendo cambiar esto, y se me ocurrió enviar este link ya con el id y el token preprocesado con

var=<?php echo base64_encode(id='.$registro.'&val='.$token);?>

y después en el activa.php hacer la inversa, hacer:

base64_decode($_REQUEST['var']);

PREGUNTA 1
Estoy en la duda de, si hago esto, ¿es necesario generar el token o sólo con el id procesado con esta encriptación alcanza?

PREGUNTA 2
En el caso de que procese el id y el token, el var me quedaría una cadena del tipo:

"id=xxxxx&val=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

¿Cómo recupero el valor del token y del id ?

solución

P1. Base 64 no es un sistema de encriptacion, más bien de codificación. Mi recomendación es que generes siempre el token y en todo caso que prescindas del id si los token son únicos.

P2. Cuando hagas el decode necesitarás parsear los datos. Por lo que yo generaría una cadena como como esta o similar

 'my_id---mi_token'

Luego después de hacer el decode los separaría con un explode() por la cadena que elijas de unión (en el ejemplo — ).

Es decir

 <?php 
 // Codificar
 $var = base64_encode($registro.'---'.$token);
 $url = 'mi.url.php?var='.$var;

 // decodificar
 $var = base64_decode($_GET['var']);
 $datos = explode('----', $var);
 echo $datos [0]; // registro
 echo $datos [1]; // token

Personalmente una cosa más que añadiría sería un tiempo máximo para la activación. Es decir en la base de datos guardaría la fecha y hora en la que se hizo el registro luego una vez que el usuario pulse el Link de activación con pararía dicha fecha con la actual para saber si ha pasado más más tiempo del límite de tiempo que determines.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *