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