2009-05-12 7 views

Respuesta

8

Puede utilizar un algoritmo hash para proteger el ID de usuario (para que nadie pueda anular el registro de su base de datos con un bucle desagradable).

Terminará con dos parámetros: userID y hash.

La ventaja es que no necesitará almacenar ninguna asignación entre el código de desactivación y el ID de usuario.

+0

Permítanme aclarar esto ... el param de ID de usuario en este caso sería hash con el hash param. Entonces los parámetros son userID y hash, y luego hash (hashedUserID, hash) = userID ... ¿correcto? – Tony

+1

Creo que quiere decir url =/unsub? UserID = x & hash = $ hash (x + secret), donde el secreto es algo que no revelas. –

+0

Luego tengo que guardar el secreto en la base de datos, que esencialmente sería el código de desactivación. Entonces, ¿cuál es la ventaja? – Tony

4

Desde la perspectiva del usuario, no es necesario que el usuario ingrese la dirección de correo electrónico para darse de baja. Un enfoque que tiene toda la información incrustada en el enlace (como usted describe) es mucho mejor.

6

Desde la perspectiva del usuario final, la cancelación de suscripción con un solo clic es excelente.

Sin embargo, usar hash (id + secret) es inseguro porque un atacante inteligente puede muy rápidamente "forzar brutalmente" el secreto, luego proceder a anular la suscripción de cada usuario en su DB simplemente incrementando la ID.

Es mucho más seguro mantener la ID "semi-secreta" en el servidor y usar la dirección de correo electrónico para buscar al usuario al darse de baja. De esta forma, una cancelación exitosa de la suscripción requiere vincular una dirección de correo electrónico con la ID correcta. Puede hacer esto aún más segura por el ahorro de una clave secreta verdad para cada usuario y el uso que en lugar de la ID. Esto es especialmente necesario si los pares de correo electrónico + ID se publican.

Así, por ejemplo, el enlace de cancelación se vería así:

http://mydomain.com/unsubscribe?email={$email}&hash={$hash} 

y una función de servidor para generar $ picadillo se vería así en PHP:

<?php 
function unsubscribeHash($id, $email) { 
    $hashSecret = 'Fz!Fx~36N66>io3B-vlPDshdRxos8JjCd4+Ld-s2^ca{19Q/5u'; 
    return sha1($id . $email . $hashSecret); 
} 
?> 

Entonces, para completar la cancelación de suscripción, se le buscar el usuario por correo electrónico, y verificar

$_GET['hash'] == unsubscribeHash($user_id, $_GET['email'])

Cuestiones relacionadas