阻止用户使用一个电子邮件地址创建多个帐户?

时间:2015-03-03 13:09:44

标签: php email mysqli

让我们说用户正在网站上创建一个帐户。用户提供的电子邮件地址保存在mysql中,但在保存之前进行哈希处理。这样一来,可能的黑客就不会看到电子邮件地址了。但另一方面,对于我或你("程序员"),无法看到用户是否正在尝试创建具有相同电子邮件地址的帐户(我真的想要阻止)

问题:一般来说,您有什么建议来解决这个问题?任何建议或解决方案都表示赞赏?

问题:帐户是否会更加安全"在散列电子邮件地址时?

P.S。仅供参考,此应用程序使用PHP作为服务器语言。

更新:

  1. 我使用BCRYPT和PHP内置的盐。
  2. 我使用mysqli。

4 个答案:

答案 0 :(得分:6)

解决方案#1 - MySQL方法

unique列上添加email索引。这将阻止添加具有相同email字段的任何其他行。没错,顺利。

假设您的表格为users,并且您在email_hashed中存储了电子邮件:

ALTER TABLE users
ADD UNIQUE (email_hashed)

如果您已经有重复项,则需要在申请前先进行清洁。

解决方案#2 - PHP方法

只需使用该哈希从数据库散列所有行的电子邮件和SELECT。像那样:

$email = 'ex@example.com';
$hashed = someHashing($email);
$sql = ("SELECT id FROM users WHERE email_hashed = '$email'");
..

如果要获取任何行,则可以执行显示消息,错误或任何内容的操作。


我建议使用这两种解决方案。

编辑 - 关于...... BCrypt ......

所以是的,你正在使用BCrypt。如果你想哈希电子邮件,有两种方法(不知道为什么,但无论如何!)。你会被所有人和更好的人嘲笑的那一个。

第一个(可笑的)是:

    来自数据库整个表的
  1. SELECT以及每个可能存在的电子邮件哈希
  2. 运行foreach() {}遍历数据库中的每个哈希
  3. 在每个循环中使用password_verify()
  4. 比较哈希值
  5. 如果任何比较返回true,则运行您自己的一些代码
  6. 第二个很容易:

    • CHANGE散列到md5(使用md5('text')功能)或sha256进行更长时间的散列(使用hash('sha256','text')

    另一个编辑

      

    问题:帐户是否会更加安全"在散列电子邮件地址时?

    我认为在 StackOverflow 上加注是没有问题的,但是因为它是一个奖励"我会在这里提出一些想法。

    我不是安全专家,所以我可能不知道什么。

    无论如何,使用BCrypt散列密码,并确保帐户中的任何内容都无法以任何方式编辑,不需要密码(例如有缺陷的API或受损的管理信息中心) )。我认为你还应该保护易受攻击的数据(如姓名,地址,电话号码等)免受公共访问。

    哈希电子邮件只有我能想到的目的。在成功破解的情况下,倾倒所有数据库的人不会获得任何单个电子邮件地址。那很好。但它也会阻止您发送简报,帐户到期通知和其他重要电子邮件。

    在90%的网站中,我会说"哈希电子邮件,你疯了吗?",但如果你根本不需要重复使用电子邮件(你赢了'除了注册之外发送任何电子邮件,并希望用户的电子邮件非常安全,然后是的,散列可以证明是有用的。但请不要BCrypt:P

答案 1 :(得分:2)

正如S.L Barth所述,您可以将给定的电子邮件地址哈希,也可以在字段失去焦点时使用ajax请求,然后检查数据库中是否存在该哈希值,如果返回的行数是> 0然后javascript可以输出一条消息,说明此帐户已经注册。

在表上创建唯一索引也可以工作,但在尝试将数据写入数据库之前,这不会反馈问题,这可能为时已晚。最终用户无需循环。

更新

如果您的电子邮件地址使用盐进行哈希处理,并且您无法再针对添加的同一电子邮件地址进行确认,那么如果无法解密,则存储电子邮件地址的重点是什么?修改你的方法。使用像Password_hash()password_verify()

这样的php函数

答案 2 :(得分:1)

当您对电子邮件进行哈希处理以将其插入数据库时​​,请检查是否已存在此类哈希电子邮件,就像每次用户登录时检查一样。

如果您对所有内容进行哈希处理,帐户会更安全,但这样会很难恢复/重置丢失的用户名/密码,因为您不知道发送重置信息的电子邮件

答案 3 :(得分:0)

onblur事件上的

散列了用户输入的电子邮件ID并检查它是否存在于mysql电子邮件列中(如果它存在)将导致一行然后禁用按钮否则允许用户插入

使用select * from user where email =“hashed(email_id_entered)”

如果(结果大于0) 禁用按钮 其他 使