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