Quelles options a-t-on pour mettre en œuvre la 3ème solution ?

Quelques critères :

  • Le lien envoyé à l'utilisateur doit être temporaire, ceci afin de ne pas renouveler le transfert de mail, à sa belle-mère, à sa voisine, à sa secrétaire, ...
  • Les paramètres du lien ne doivent pas être modifiables / modifiés par l'internaute: l'identifiant de l'utilisateur concerné, la date d'envoi, ...

Pour le 1er point, il suffit d'inscrire la date d'envoi du lien, soit en base, soit directement dans l'URL, et de refuser le lien si le délai dépasse 3 jours par exemple.

On se retrouve avec un lien à envoyer de ce type : http://mydummy.fr/reinit/?id=4&dte=2008-11-27

Pour répondre au point 2, deux solutions :

  • ajouter une clé de HASH SHA-1 au lien : composée de la valeur des paramètres + une clé privée. On enverra http://mydummy.fr/reinit/?id=4&dte=2008-11-27&HASH=xyz. Il suffit alors de recomposer un HASH avec la valeur id + dte + secret puis de le comparer avec le HASH du lien. Il existe une méthode très utile qui permet de répondre à ce besoin : HashPasswordForStoringInConfigFile(chaineahasher,methodedehash), la méthode de hash est soit MD5, soit SHA1. On évitera la 1ère (MD5) car des collisions possibles ont été découvertes et n'est plus considérée comme sûre (si tu as un récent PC, alors amuse-toi à cracker un MD5). Cette méthode transformera l'entrée chaineahasher en Hash SHA1 puis transformera chaque lettre de la clé dans son équivalent en code Hexa (sans les %).
  • crypter l'ensemble (voir ce billet à titre d'exemple) pour avoir un seul paramètre qs=valcrypte contenant l'ensemble de paramètres, mais rendus invisibles, cela évite la possibilité ou du moins de façon non triviale, de modifier la valeur des paramètres par un utilisateur. On veillera à URL encoder valcrypte (HttpUtility.UrlEncode(valcrypte) / HttpUtility.UrlDecode(valcrypte)). Cela donnera ce type de lien : http://mydummy.fr/reinit/?qs=VEQ5emM1SWk4ZUVZNmNDbytDVDYwbEhGMWMrWH

On prendra une attention toute particulière à ce que le lien de ré-initialisation passe sur la majorité des Webmails (GMail, Free, Hotmail, ...) ou autres clients de messagerie (Outlook, Thunderbird et même...Lotus Notes). L'URLEncoder est une bonne base pour se protéger des caractères mal interprétés par les clients de messagerie afin qu'ils reconstruisent l'URL pour qu'elle soit cliquable.

Conclusion

Quelques techniques parmi d'autres, je dois en oublier, mais en général, le challenge pour une ré-initialisation me parait la meilleure solution, la plus sécurisée en tout cas.