用PHP验证电子邮件

时间:2017-07-22 21:09:37

标签: php mysql security registration

目前,用户可以在我的网站(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,新电子邮件地址和散列密码的新哈希的网址) +新的电子邮件地址)。在我看来,这看起来有点狡猾,但我没有看到另一种方法来改变它。

3 个答案:

答案 0 :(得分:3)

最好创建一个单独的标记(在链接中作为查询发送的一些哈希),它与DB中的时间戳一起存储。这样你就有了一个链接,可以检查时间戳,链接是否已经过期(比较令牌的时间戳和请求的当前时间(当用户打开他的链接时)。

答案 1 :(得分:3)

因为我们已经进入了这个阶段,所以我要投入2美分不仅仅是这样做,而是做得很好。

大多数人都建议您在用户表中添加一列或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表的外键。

答案 2 :(得分:2)

我会说:数据库中有额外的哈希值或任何随机字符串。无需在线路上发送密码甚至是哈希密码。