热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《阻止用户使用一个电子邮件地址创建多个帐户?》经验,为你挑选了1个好方法。

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

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

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

PS FYI,这个应用程序使用PHP作为服务器语言.

更新:

    我使用BCRYPT与PHP内置盐.

    我用mysqli.

Forien.. 6

解决方案#1 - MySQL方法

uniqueemail列上添加索引.这将阻止添加具有相同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.如果你想哈希电子邮件,有两种方法(不知道为什么,但无论如何!).你会被所有人和更好的人嘲笑的那一个.

第一个(可笑的)是:

    SELECT 从数据库整个表中包含每个可能存在的电子邮件哈希值

    运行foreach() {}循环遍历数据库中的每个哈希

    在每个循环中比较哈希使用 password_verify()

    如果有任何比较返回,true则运行您自己的一些代码

第二个很简单:

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

另一个编辑

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

我认为在StackOverflow上加注并不是问题,但由于它是"奖金",我会在这里提出一些想法.

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

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

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

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



1> Forien..:
解决方案#1 - MySQL方法

uniqueemail列上添加索引.这将阻止添加具有相同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.如果你想哈希电子邮件,有两种方法(不知道为什么,但无论如何!).你会被所有人和更好的人嘲笑的那一个.

第一个(可笑的)是:

    SELECT 从数据库整个表中包含每个可能存在的电子邮件哈希值

    运行foreach() {}循环遍历数据库中的每个哈希

    在每个循环中比较哈希使用 password_verify()

    如果有任何比较返回,true则运行您自己的一些代码

第二个很简单:

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

另一个编辑

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

我认为在StackOverflow上加注并不是问题,但由于它是"奖金",我会在这里提出一些想法.

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

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

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

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


为什么你这么沉重的哈希?你似乎通过使一切都不可读的方式让自己更多地工作.如果您使用带有BCRYPT的内置salt,则salt会内置到哈希中,因此您需要运行并检查数据库中的每一行,但如果繁琐的话,它至少是可能的.实际上不建议使用自己的盐
@ user3892683好吧,我根本不知道**为什么你用'BCrypt`来发送电子邮件.如果密码来自同一来源,则用于比较两个哈希值.如果你坚持使用散列电子邮件,请使用`md5()`或`hash('sha256')`,否则你需要选择**整个**用户表并运行`foreach`循环来比较**每个**散列使用`password_verify()`会很糟糕.
推荐阅读
author-avatar
傻瓜等傻子
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有