0

我有这封帐户创建电子邮件,它会发送给任何尝试创建帐户的人,因为我需要验证他们是他们所说的人。

但是,我的问题是他们收到我的电子邮件时需要单击的 URL 太长,并且某些电子邮件客户端处理得不是很好,有时会截断 URL,从而使单击时 URL 无效。

因为 URL 包含域名、散列电子邮件和长激活码。它看起来像这样。

http://domain.com/activation?email=75a5867d3df134bededbaf24ff17624d&key=8fecb20817b3847419bb3de39a609afe

虽然有些电子邮件客户端对此可以接受,但有些则不行……而且我不想使用 HTML 电子邮件,而是坚持使用纯文本电子邮件。我也听说过使用 URL 缩短器的可怕故事,所以我不确定是否应该使用它们......

对此领域的任何见解表示赞赏!

4

1 回答 1

0

我肯定会同意杰森:缩短你的网址。

想想你真正需要什么。

  • 电子邮件地址很可能已经在数据库中,因此您可以参考是否使用短 ID(假设最多 7 个数字)。您的签名可以非常简单,例如substring (base64_url(md5(email+salt)), 0, 5). 5 个 base64 字符是 64^5=大约 10 亿种可能性。这可能足够安全(如果有人使用错误的电子邮件地址注册,真正的损害是什么)。所以你的 url 会是http://domain.com/activation?email=1234&key=aD5Y_http://domain.com/activation?e=1234&k=aD5Y_甚至是http://domain.com/activation?e=1234aD5Y_. 在最后一种格式中,您知道最后 5 个字符是键,所以其余的是 id。请注意,代码示例假定 md5 以 8 位字符串格式(而不是十六进制字符串格式)返回,并且 base64_url 使用url 安全的 base64 方法此外,还有一些关于盐的背景信息。
  • 如果您的电子邮件地址的 id 很长或者还需要在 url 中进行编码,或者上面的内容还不够短,请考虑使用更短的形式。基本上这将导致制作您自己的网址缩短器。就在您将链接插入电子邮件之前,生成一些随机的 5 个字符串。将此字符串作为键插入 memcached(或数据库),并将原始 url 作为值。那么你的网址可能是http://domain.com/redirect?key=rT-tW. 当您在应用程序中看到此内容时,只需从 database/memcached 检索原始 url 并重定向到那里。

请确保您的系统在以下情况下是健壮的:

  • 有人输入电子邮件地址(他们的真实电子邮件),您发送链接
  • 该人在单击链接之前将其电子邮件地址更改为网站上的虚假地址,您将新电子邮件发送到新(虚假)电子邮件地址
  • 他们现在单击第一封电子邮件中的链接,您的网站会在第二封(假)表格中确认他们的电子邮件地址。

一种方法是确保在密钥生成中使用电子邮件地址本身(而不仅仅是用户 ID),如上所述。

于 2012-02-20T17:40:57.847 回答