2009-05-18 13 views
19

Después de que el usuario suscriba el correo electrónico a mi sitio web. Mi sitio web generará una confirmación por correo electrónico y se los enviará. En el contenido del correo electrónico, i necesidad de incluir la clave de activación, algo así como:Cómo generar una cadena de activación segura en php?

www.domain.com/activate.php?key=$generatedKey

¿Cómo se genera la clave? usando sha1 ($ email) ??

Después de generar la clave, la almaceno en la base de datos, de modo que cuando el usuario haga clic en el enlace, ¿puedo verificarlo con la base de datos? Soy nuevo en ella, por favor avise .. Necesito un script Confirmación ..

Respuesta

24

Personalmente, acabo de utilizar una combinación de cosas como:

$generatedKey = sha1(mt_rand(10000,99999).time().$email); 

La probabilidad de colisión es pequeña, pero lo recomiendo revisando su base de datos primero antes de enviarla (usando restricciones ÚNICAS es una manera fácil).

+5

No hay posibilidad de colisión si agrega la identificación de usuario a la URL y comprueba que ambas coincidan. – Eli

+0

@Eli, existe la posibilidad, ya que algunas colecciones de caracteres hacen hash con la misma cadena hash. Aunque la posibilidad es bastante insignificante (pero aún está allí). – alex

+2

Ehh, no soy partidario de revelar información de la clave principal al usuario. Pero esa es una buena idea, Eli. entonces key = $ generatedKey & id = $ uid –

1
$guid=md5(uniqid(mt_rand(), true)); 
0

Eso debería hacerlo, sin embargo se puede mejorar mediante la adición de un poco de sal, ejemplo:

$key = sha1($email . 'doYouLikeSauce'); 

Otro enfoque es sólo para generar una contraseña aleatoria y enviarlo por correo electrónico.

1

Si está almacenando la cadena de activación en la base de datos y luego la revisa, ¡no necesita ningún hash!

Solo necesita una cadena larga y aleatoria. Puedes generarlo como quieras, solo hazlo de largo. De hecho, lo ideal es que no tenga nada que ver con el correo electrónico o el nombre de usuario.

+1

Es por eso que sha1, md5 y otras funciones de cripta son buenas ya que crean cadenas aparentemente aleatorias. Si desea cadenas que sean únicas (colisión baja), su mejor opción es basarlas en una constante única (correo electrónico) y un poco de salazón adicional. –

+2

Las funciones hash no agregan ninguna entropía por lo que no hacen colisiones más o menos probable en este caso. Simplemente * miran * más al azar para nosotros los humanos. – Eli

7

que básicamente tienen algunas opciones:

1) Crear un único identificador único que es aparentemente al azar y lo almacenan en su base de datos con la que nombre de usuario corresponde a

2) Generar una contraseña aleatoria e incluyen la identificación de usuario y la contraseña en el enlace y almacenar la contraseña en la base de datos

3) Utilice una función hash unidireccional (md5, sah1, etc.) y un identificador secreto para encriptar el identificador de usuario. No tiene que almacenar el identificador de usuario cifrado en su base de datos.

La opción 1 es difícil porque tiene que preocuparse por verificar la base de datos para ver si la clave ya existe. Sin embargo, es bueno que la URL no contenga el nombre de usuario activado.

Si ya va a utilizar algún tipo de base de datos para almacenar la información del usuario (probablemente una contraseña como mínimo) en el futuro, puede ir con la opción 2. No se necesita mucho para agregar otra columna a tu base de datos Al enviar el correo electrónico, guarde el nombre de usuario y algo como $ key = sha1 (rand (1, 99999). $ Username) en otra columna para la fila que contiene el nombre de usuario. Luego haga que su enlace se vea así: http://you.com/activation.php?user= $ username & key = $ key. En activation.php, comprueba si la clave es igual al valor almacenado en la base de datos.

Si desea utilizar menos espacio de almacenamiento en su base de datos, la opción 3 funcionará. Puede usar algo como $ key = sha1 ($ mysecret. $ Username) como el identificador secreto. Use algo extraño que solo usted conoce como $ mysecret, como 'aaafj_my_secret_adfaf'. Use el mismo tipo de URL que en la opción 2.Sin embargo, como puede generar $ key solo en $ username, no necesita almacenarlo. Entonces, cuando está procesando en activation.php, simplemente verifique si sha1 ($ mysecret. $ _GET [username]) == $ _GET [key]. Si lo hace, sabrá que tiene el usuario correcto. Teóricamente, con suficientes registros, alguien podría calcular su valor para $ mysecret y generar también las claves de activación. Sin embargo, seguramente notaría los miles de millones o más de registros que tomaría antes de que pudieran comenzar a calcular cuál es. La cantidad de activaciones requeridas se basa en el tamaño de la clave de la función hash. Use sha1 (160 bit) vs md5 (128 bit) para que sea más difícil adivinar su valor de $ mysecret.

+1

¡Muy buen resumen de opciones y sus pros y contras! Solo agregaría que no importa qué opción elijas, hay algunas "invariantes" que son verdaderas para todas ellas. Por ejemplo: 1. El enlace de activación tiene que ser único, como un todo, porque si no lo es, no se puede decir a qué usuario se debe activar. 2. Debe almacenar al menos la dirección de correo electrónico en su base de datos, y debe ser única también. En esta vista, la estafa de la primera opción no es tanto una estafa, porque terminará revisando la unicidad de todos modos (de la dirección de correo electrónico como mínimo). – SasQ

0
$code = md5($_POST['username'] . microtime()); 
Cuestiones relacionadas