下午好,
我正在编写一个脚本,允许新闻用户在网站上注册。
简而言之,这些是我计划的步骤:
-
register.php-新用户填写表单,输入用户名、地址详细信息、企业名称和电子邮件地址。然后通过SSL将数据发布回脚本。
-
register.php-脚本检查用户名或电子邮件地址是否已存储在数据库中。如果不是,它会使用这些数据生成一个令牌,该令牌以超链接的形式通过电子邮件发送到电子邮件地址,该令牌和其余数据作为超链接的参数。所使用的令牌是由一个秘密字符串组成的——这样,只有这个脚本才能生成一个代码,该代码可以使用其余数据进行重建。
-
电子邮件-点击超链接(SSL(,从而通过$_GET将数据通过SSL传递到下一个脚本中。
-
verify.php-令牌是使用传递的$_GET数据和已知的秘密字符串重建的。如果散列是相同的,我们就知道令牌是由我们的一个脚本生成的。系统会提示用户输入密码(两次(,然后单击"提交"(通过SSL将数据发布到自己(。
-
verify.php-在将新用户数据以及哈希密码和salt插入数据库之前,脚本会检查用户名或电子邮件地址是否不存在。
-
电子邮件-向管理员发送电子邮件通知,告诉他们新用户已经注册-新用户需要获得批准才能登录。该电子邮件包含指向下一个脚本的链接,新用户的ID通过$_GET传递给它。使用SSL。
-
confirm.php-脚本使用传递的新用户ID在可编辑字段(而不是密码或salt(中显示已注册的所有详细信息。单击"确认"后,表单数据将通过SSL发布回同一脚本。
-
confirm.php-脚本更新该用户的记录,并将新用户记录设置为"confirmed"。新用户收到电子邮件通知,现在可以登录
这可能看起来很长,但需要完成一系列步骤。
所有新用户都必须验证他们的电子邮件地址,然后才能将任何数据存储在我们的数据库中。密码的传递不会超出它需要的范围。它只是以原始形式通过POST传递回"verify.php"脚本,然后对其进行散列。我将确保SSL数据包的POST数据不会记录在服务器上。这样,服务器上就不应该有原始密码的记录,对吧?
生成并存储每个用户的随机salt,以防止出现彩虹表。
我错过什么了吗?我唯一关心的是通过SSL传输原始密码。尽管SSL可以防止嗅探,但我仍然对将原始密码接收到服务器感到不安。也就是说,我不想通过在客户端对项目进行哈希处理,使其容易受到"中间人"攻击。
有人能指出我的方法有什么缺陷吗?我试着在谷歌上搜索了一下,虽然有一些适用的帖子,但在整个过程中似乎没有任何联系。我希望这个帖子能让未来的访问者和我自己都受益。
谢谢。
两个月前我也不得不做同样的事情,我按照你的方式做了。除了这一点:
在要求用户输入所有内容之前,第一步应该是验证和确认电子邮件。一旦完成,我们会询问其他一切。
达到2个目标:
-
用户有时害怕输入太多信息
如果他们已经发送了电子邮件,他们通常更愿意继续这个过程。 -
已经注册并位于错误页面的用户:你可以假设他们丢失了电子邮件,并提出解决方案(如果电子邮件已经在数据库中(
但我个人认为最好的办法是坚持openId;-(下一次我会尝试使用它。