【问题标题】:Email verification in PHP [closed]PHP中的电子邮件验证[关闭]
【发布时间】:2017-07-22 21:09:37
【问题描述】:

此时用户可以在我的网站(username, password, email)创建一个帐户

这将在数据库中创建一个条目,该条目存储用户名、密码的哈希值和电子邮件地址,并将用户的级别设置为 0。之后它将发送一封包含 id 的 url 的电子邮件用户和哈希密码的新哈希。

$emailhash = password_hash($passwordHash, PASSWORD_BCRYPT, $options);
$url = "domain/validation.php?id=$id&hash=$emailHash";

在 url 指向的验证页面,它将使用哈希密码作为密码和电子邮件中的哈希来检查用户是否使用现有的电子邮件地址。

password_verify(hashedPasswordFromDB, hashOfHashFromEmail);

这是验证用户的安全方法,还是我应该为额外的哈希添加额外的表/列?我当前的方法和/或其他方法的优点/缺点是什么? (例如,更简单的表格...)

编辑: 如果用户想要更改他的电子邮件地址(我现在正在添加的东西),我想实现相同的方法(发送一个包含 id、新电子邮件地址和哈希密码的新哈希的 url +新的电子邮件地址)。在我看来,这看起来有点曲折,但我没有看到其他方法来改变它。

【问题讨论】:

  • 这对我来说看起来不错...这就是我进行“电子邮件验证”的方式。
  • 为什么要涉及密码?如果您使用的是 PHP,我希望您使用的是 php.net/manual/en/function.password-hash.php。只需使用一些随机输入和电子邮件地址本身创建一个单独的 sha1 哈希,并将其用作哈希的输入。
  • 我在用户上有一个验证令牌列,一个随机字符串,当用户点击链接时,它与用户匹配。
  • @PraveenKumar 您如何使用该设置处理电子邮件更改?
  • @Hedylogos 查看我的答案以获得更灵活的系统。如果您想允许更改电子邮件地址,则可以轻松适应。当然,您需要为每种类型的事件单独处理代码。对于电子邮件更改,通常它的工作方式是用户提出请求,您向他们发送新的验证到他们请求的电子邮件,并且只有在他们验证后才进行更改。我添加了一个“额外”列,您可以在其中存储新电子邮件和旧电子邮件,以便您可以在用户验证请求时对请求采取行动。

标签: php mysql security registration


【解决方案1】:

既然我们已经进入这个问题,我将投入 2 美分,不仅要做到这一点,而且要做得好。

大多数人建议您在用户表中添加一列或两列。这很简单,而且很有效。

但如果你想做好这件事,你需要考虑一些事情:

  • 你们是否也支持通过电子邮件重置密码
  • 您是否会过期验证或重置
  • 您可以跟踪试图入侵帐户的人吗?
  • 是否存在某种拒绝服务或其他问题?

做到这一点的最佳方法是拥有一组与捕获此类帐户事件的用户表相关的单独表。

以下是典型的帐户事件列表:

  • 帐号注册
  • 账户验证
  • 帐户暂停
  • 帐户删除
  • 密码重置请求
  • 更改电子邮件

在一个健壮的系统中,这些事件中的每一个都有一个时间戳,通常都会有一个过期时间。

其中许多都有相关的哈希值,需要存储并在电子邮件中发送。

它们都有一个“已完成”标志来指示隐含的操作是否已完成。

因此,更好的处理方法是为用户提供一个单独的相关表。为了便于讨论,该表看起来像这样:

user_event
-----------
user_event_id (pk)
user_id (fk from user table)
created_on (timestamp)
event_type (registration | verification | password reset, etc)
expires_on (datetime) - manually set as is suitable
token (char40) - sha1
is_complete (tinyint)  A boolean to indicate if the action was completed
complete_on (timestamp)
user_ip (ip address of end user)
extra (varchar) : store the new email here.  Change to old email when you complete the request. 

这是一种在系统中持久保存这些类型活动所需数据的更强大的方法,并且还具有一些内置日志记录。您有活动的审计跟踪,可以处理或防止重复请求。

您还可以使重置请求过期,并使用这些过期的请求进行老化活动,例如向从未完成注册的人发送提醒电子邮件。

您现在拥有一个无需单独的附加表即可支持其他帐户相关功能的系统,并且您可以通过创建新的 event_type 来编写新事件。这些可以只是一个字符串,但您可能还想创建一个查找表并将其用作 user_event 表的外键。

【讨论】:

  • 感谢您的清晰解释,我已经为每个事件记录了所有与帐户相关的事件,并在不同的表中记录了时间戳、uid、ip 以及发生了什么变化/发生了什么。您的表格看起来比我当前使用的表格更广泛,我真的很喜欢 url 上的到期日期的可能性。本来想要求额外的 var,但既然你已经添加它已经很完美了。
【解决方案2】:

最好创建一个单独的令牌(作为查询在链接中发送的一些哈希),它与时间戳一起存储在数据库中。这样你就有了一个链接,并且可以检查时间戳,如果链接已过期(将令牌的时间戳与请求的当前时间(当用户打开他的链接时)进行比较。

【讨论】:

  • 您也可以根据需要更改令牌,并在验证用户时释放令牌,而无需更改密码。最好有一个特定的列。
【解决方案3】:

我会说:数据库中的额外哈希或任何随机字符串。无需通过线路发送密码甚至散列密码。

【讨论】:

    猜你喜欢
    • 2015-06-27
    • 2017-05-28
    • 1970-01-01
    • 2014-10-17
    • 2016-05-21
    • 2014-07-20
    • 1970-01-01
    • 2011-09-25
    • 2017-03-19
    相关资源
    最近更新 更多