gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 00:08:48 25 4
gpt4 key购买 nike

假设用户正在网站上创建帐户。用户提供的电子邮件地址保存在 mysql 中,但在保存之前进行了哈希处理。这样,可能的黑客就不会看到电子邮件地址。但另一方面,对于我或你(“程序员”)而言,无法查看用户是否试图使用相同的电子邮件地址创建帐户(我真的想阻止)。

问题:一般来说,您对解决这个问题有何建议?有任何建议或解决方案吗?

问题:对电子邮件地址进行哈希处理时,帐户会更“安全”吗?

附言仅供引用,此应用程序使用 PHP 作为服务器语言。

更新:

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

最佳答案

解决方案 #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 .如果您想散列电子邮件,有两种方法可供您使用(不知道为什么,但无论如何!)。一个你会被所有人 mock 的人,一个更好的人。

第一个(可笑的)是:

  1. SELECT来自数据库的整个表,其中包含所有可能的现有电子邮件散列
  2. 运行 foreach() {}遍历数据库中的每个散列
  3. 在每个循环中使用 password_verify() 比较哈希
  4. 如果有任何比较返回true然后运行一些你自己的代码

第二个很简单:

  • 将散列更改为 md5 (使用 md5('text') 函数)或 sha256对于更长的哈希值(使用 hash('sha256','text') )

另一个编辑

Question: Would an account be more "secure" when hashing the e-mail address?

我认为这不是在 StackOverflow 上提出的问题,但因为它是“奖励”,所以我会在这里提出一些想法。

虽然我不是安全专家,所以我可能不知道某些事情。

无论如何,使用 BCrypt 散列密码并确保帐户上的任何内容都不能以不需要密码的任何方式进行编辑(例如有缺陷的 API 或受损的管理仪表板)。我认为您还应该保护易受攻击的数据(如姓名、地址、电话号码等)不被公开访问。

散列电子邮件有只有一个我能想到的目的。万一成功破解,倾倒了您所有数据库的人将不会获得任何一个电子邮件地址。那很好。但它也会阻止您发送时事通讯、帐户到期通知和其他重要电子邮件。

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

关于php - 防止用户使用一个电子邮件地址创建多个帐户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28832657/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com