php - 用户注册(以及稍后的身份验证)——我的方法还是使用 OpenID?

标签 php authentication passwords hash registration

下午好

我正在编写一个允许新闻用户在网站上注册的脚本。

简而言之,这些是我计划的步骤:

  1. register.php - 新用户填写表格,输入用户名、详细地址、公司名称和电子邮件地址。然后通过 SSL 将数据发回脚本。

  2. register.php - 该脚本检查用户名或电子邮件地址是否尚未存储在数据库中。如果不是,它会使用这些数据生成一个 token ,该 token 以超链接的形式通过电子邮件发送到电子邮件地址,该 token 和其余数据作为超链接的参数。使用的 token 由 secret 字符串组成 - 这样,只有此脚本才能生成可以使用其余数据重建的代码。

  3. 电子邮件 - 单击超链接 (SSL),从而通过 $_GET 将数据通过 SSL 传递到下一个脚本。

  4. verify.php - 使用传递的 $_GET 数据和已知的 secret 字符串重建 token 。如果哈希值相同,我们就知道 token 是由我们的脚本之一生成的。在单击“提交”(通过 SSL 将数据发布给自己)之前,系统会提示用户输入密码(两次)。

  5. verify.php - 该脚本检查用户名或电子邮件地址是否不存在,然后将新用户数据连同散列密码和加盐值插入数据库。

  6. email - 向管理员发送电子邮件通知,告诉他们新用户已注册 - 新用户需要获得批准才能登录。电子邮件包含指向下一个脚本的链接,新用户的 ID 通过 $_GET 传递给它。使用 SSL。

  7. confirm.php - 该脚本使用传递的新用户 ID 在可编辑字段(不是密码或盐)中显示已注册的所有详细信息。单击“确认”后,表单数据将通过 SSL 回传到同一脚本。

  8. confirm.php - 该脚本更新该用户的记录,并将新用户记录设置为“已确认”。新用户收到电子邮件通知,现在可以登录。

这可能看起来很长,但是有一系列的步骤需要完成。

在我们的数据库中存储任何数据之前,所有新用户都必须验证他们的电子邮件地址。密码不会超过它需要传递的次数。它仅以原始形式通过 POST 传递回“verify.php”脚本,然后对其进行哈希处理。我将确保 SSL 数据包的 POST 数据没有记录在服务器上。这样一来,服务器上应该就没有原始密码的记录了吧?

为每个用户生成并存储随机盐 - 以防止出现彩虹表。

我错过了什么吗?我唯一担心的是通过 SSL 传输原始密码。尽管 SSL 可以防止嗅探,但我仍然对将原始密码接收到服务器感到不安。也就是说,我不想通过在客户端对其进行哈希处理,使该项目容易受到“中间人”攻击。

任何人都可以提出我的方法中的任何缺陷吗?我尝试用谷歌搜索这个,虽然有一些适用的帖子,但在整个过程中似乎没有任何关系。我希望这个话题能使这个页面的 future 访问者以及我自己受益。

谢谢。

最佳答案

我 2 个月前不得不做同样的事情,我按照你的方式做了。除了这一点:

在要求用户输入所有内容之前,第一步应该是验证和确认电子邮件。完成后,我们会询问其他一切。

达到了 2 个目标:

  1. 用户有时害怕输入太多信息。
    如果他们已经发送了电子邮件,他们通常更愿意继续这个过程。

  2. 已经注册且位于错误页面的用户:您可以假设他们丢失了电子邮件并提出解决方案(如果电子邮件已在数据库中)

...但我个人认为最好的办法是坚持使用 openId ;-) 下次我会尝试使用它。

关于php - 用户注册(以及稍后的身份验证)——我的方法还是使用 OpenID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6582485/

相关文章:

php - 最佳实践按发布日期排序帖子

php - 来自数据库的随机图像,带有 id 的链接

php - 为什么 sprintf 给出星号而不是我的格式化字符串?

javascript - 无法从 User.js 中找到方法

postgresql - 我如何处理密码和 dockerfiles?

php - Symfony sfGuardPlugin 密码恢复

php - 来自动态 JSON 的 Fullcalendar 加载事件

python - Django:is_authenticated 和 is_anonymous 在注销后都返回 true

authentication - 使用 Azure AD 时收到 IDX10501 : Signature validation failed. 无法匹配 key 的错误消息

Mysql加密类型