用户注册(稍后进行身份验证)-我的方法还是使用OpenID


User registration (and authentication later) - my method or use OpenID?

下午好,

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

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

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

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

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

  4. verify.php-令牌是使用传递的$_GET数据和已知的秘密字符串重建的。如果散列是相同的,我们就知道令牌是由我们的一个脚本生成的。系统会提示用户输入密码(两次(,然后单击"提交"(通过SSL将数据发布到自己(。

  5. verify.php-在将新用户数据以及哈希密码和salt插入数据库之前,脚本会检查用户名或电子邮件地址是否不存在。

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

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

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

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

所有新用户都必须验证他们的电子邮件地址,然后才能将任何数据存储在我们的数据库中。密码的传递不会超出它需要的范围。它只是以原始形式通过POST传递回"verify.php"脚本,然后对其进行散列。我将确保SSL数据包的POST数据不会记录在服务器上。这样,服务器上就不应该有原始密码的记录,对吧?

生成并存储每个用户的随机salt,以防止出现彩虹表。

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

有人能指出我的方法有什么缺陷吗?我试着在谷歌上搜索了一下,虽然有一些适用的帖子,但在整个过程中似乎没有任何联系。我希望这个帖子能让未来的访问者和我自己都受益。

谢谢。

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

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

达到2个目标:

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

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

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