PHP中的电子邮件验证

此时用户可以在我的网站上创建一个帐户(用户名,密码,电子邮件)

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

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

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

password_verify(hashedPasswordFromDB, hashOfHashFromEmail);

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

编辑:
如果用户想要更改他的电子邮件地址(我现在正在添加的内容),我想实现相同的方法(发送包含id的新网址,新的电子邮件地址和新的哈希密码哈希值邮箱地址).在我看来,这看起来有点狡猾,但我没有看到另一种方式来改变它.

解决方法:

因为我们已经进入了这个阶段,所以我要投入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表的外键.

上一篇:python中lambda,map,reduce,filter,zip函数


下一篇:php – 自动检查在Woocommerce Checkout页面中创建帐户字段