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

Lew*_*ett 5 php authentication passwords hash registration

下午好,

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

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

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

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

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

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

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

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

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

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

这似乎很长,但有一系列步骤需要完成.

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

生成并存储每个用户的随机盐 - 以防止彩虹表.

我错过了什么吗?我唯一的音乐会是通过SSL传输原始密码.虽然SSL可以防止嗅探,但我仍然不愿意将原始密码接收到服务器中.也就是说,我不希望通过对客户端进行散列来使项目易受"中间人"攻击.

任何人都可以建议我的方法有任何缺陷吗?我尝试使用Google搜索,虽然有一些适用的帖子,但整个过程似乎没有任何关系.我希望这个主题将有利于未来的访问者和我自己.

谢谢.

小智 2

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

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

达成2个目标:

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

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

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