【问题标题】:verify a user via e-mail in PHP在 PHP 中通过电子邮件验证用户
【发布时间】:2017-06-24 02:21:08
【问题描述】:

我实际上是在使用 PHP 创建一个 Web 应用程序并寻求帮助来验证用户。 与某些网站一样,当您注册时,系统会向您发送一封带有确认链接的电子邮件。我如何在 PHP 中实现它? 我只知道我必须使用 PHP mail() 函数来发送电子邮件。 请帮忙。必要的。谢谢。 :)

【问题讨论】:

    标签: php email authentication verification email-validation


    【解决方案1】:

    这是一个非常宽泛的问题,所以我们只能给出一个宽泛的答案,但这样做的一般技巧是

    1. 将用户的电子邮件地址插入您的数据库,但将其标记为未验证
    2. 为这些键创建一个唯一的注册密钥并将其插入到不同的表中
    3. 向用户的电子邮件地址发送一封电子邮件,其中包含指向您网站的链接,该链接将此注册密钥作为参数传递(例如http://site.com/confirm.php?key=1234
    4. 访问该网址时,将电子邮件标记为已验证并删除临时创建的注册密钥

    【讨论】:

    • 谢谢帕特里克。这有很大的帮助。你们三个人(乔、你和阿尔弗雷德)都对我真正“广泛”的问题给出了完整的解决方案。干杯。保持联系。 :)
    • 你怎么知道是那个用户访问了这个 url?或者,是否为每个用户提供了一个唯一的 url?
    • @ggkmath 因为第 2 步,“创建唯一的注册密钥”。如果你使用序列号,肯定有人可能只是猜测序列中的下一个,但是如果你做一个随机数的 md5 和之类的事情,没有人会猜到。
    【解决方案2】:

    就像使用CSRF 保护一样,您会生成一个唯一令牌。

    $token =  md5(uniqid(rand(), TRUE));
    

    您将该值存储在该电子邮件的会话中,当用户单击电子邮件中的链接时(您通过 query-string 传递令牌)您比较这两个值。

    为了使其更安全,您可以像使用 CSRF 一样添加时间限制。

    【讨论】:

    • 你为什么要通过 md5 运行它。您刚刚创建了一个不那么独特的唯一键。
    • 谢谢阿尔弗雷德。您为我提供了正确的解决方案,以进一步完成任务。干杯! :)
    • @Petah 你还能做什么?
    • @Menasheh 类似bin2hex(openssl_random_pseudo_bytes(64))
    【解决方案3】:

    Patricks 的回答是正确的,但我想指出还有其他可能性!

    您不必在数据库中创建和存储唯一令牌。这是只需要一次的数​​据开销。

    您还可以利用单向哈希。

    例如向用户发送代码md5('my-secret-application-token'.$user_email_adress)

    您可以用同样的方式验证,但不需要存储密码。

    【讨论】:

    • 如果我偷了my-secret-application-token,那么我可以以任何我想登录的用户身份登录:P。
    • true @Alfred 这就是为什么要创建密码、钥匙串、令牌和所有这些东西的原因!如果没有你偷,那会很无聊。
    • 谢谢乔。那我的这个问题就告一段落了。谢谢您的帮助。保持联系。干杯。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-03-21
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2013-08-17
    相关资源
    最近更新 更多