Php 直接向用户发送用户名和密码时出现问题?

Php 直接向用户发送用户名和密码时出现问题?,php,security,passwords,Php,Security,Passwords,我正在构建一个基本的应用程序,用户可以在其中创建一个帐户。用户可以让用户名像alex一样简单。可以有多个用户名为alex的用户。我将为它们中的每一个生成一个唯一的密钥作为密码。密钥可以是a3exyG、alevuQ或类似的东西。此密钥将与用户名一起邮寄给用户。稍后,这些可以用于登录。我的问题是这是否会带来任何安全问题。我的意思是,如果其他人已经可以访问用户的电子邮件id,他/她仍然可以重置密码。您不应该以纯文本发送/存储合理的数据。通常的做法是向用户发送一个指向您的网页的链接,用户可以在其中设置密

我正在构建一个基本的应用程序,用户可以在其中创建一个帐户。用户可以让用户名像alex一样简单。可以有多个用户名为alex的用户。我将为它们中的每一个生成一个唯一的密钥作为密码。密钥可以是a3exyG、alevuQ或类似的东西。此密钥将与用户名一起邮寄给用户。稍后,这些可以用于登录。我的问题是这是否会带来任何安全问题。我的意思是,如果其他人已经可以访问用户的电子邮件id,他/她仍然可以重置密码。

您不应该以纯文本发送/存储合理的数据。通常的做法是向用户发送一个指向您的网页的链接,用户可以在其中设置密码

我会怎么做:

让用户在注册时选择自己的密码 将密码散列存储 如果你用一个ID而不是电子邮件来注册,你应该让他们是唯一的,因为有人和我有相同的ID,我输入了一个错误的密码,并意外登录到其他用户帐户,这不是很安全。 另一种选择是,在使用通过电子邮件收到的密码登录网站后,强制用户更改其在网站中的密码

更多信息:


用户可以更改密码吗?如果可以,如果有两个条目匹配同一个用户和密码,您将遇到问题…

我个人不会这么做。用户名应该是唯一的,以避免出现任何问题,密码应该始终在数据库中散列并由用户选择

当您进行身份验证时,应将输入的密码进行散列,并与数据库中的值进行比较…单向街道

密码从未邮寄给用户

如果您需要重置忘记的密码,我会创建一个过期的令牌,并通过电子邮件向用户发送一个带有该令牌的链接,将用户带到页面以输入新密码

编辑:
我要说的是,有人能够访问某人的电子邮件的风险远远小于有明文存储的密码、到处发送的密码以及系统上重复的用户名。

再加上@Gori所说的,我认为这是开发人员的责任问题

通过电子邮件发送任何类型的敏感数据(如密码)或以纯文本形式存储这些数据是不安全的,因此是不负责任的

如果两个用户具有相同的名称和密码怎么办?要区分用户的信息越多,就越容易保护帐户和识别正确的用户

作为开发人员,您的责任不在于确保用户的电子邮件安全。这是电子邮件提供商的责任。只需确保你所写和推动的内容是正确的


关于这一点,公认的答案很好地说明了这一点。你可以看看

不,如果他们请求重置密码,我将向他们发送一个类似的随机生成的密钥,该密钥不会与其他密钥冲突。@SujataHulsurkar您可以向他们的电子邮件发送一个指向您网页的链接,他们可以在其中为其帐户输入新密码。如果有人已经可以访问电子邮件Id,他们可以以任何方式设置或重置密码。那么,增加复杂性的意义何在呢?@SujataHulsurkar这不是增加复杂性,只是简单的安全性。我可以选择一个像alex这样的普通用户名,然后开始尝试普通密码,也许alex的其中一个有字典密码,可以轻松登录到人们的帐户。我根据用户名决定随机字符串的密码。对不起,如果我听起来很傻的话。我只是想了解这个方法的主要问题。@SujataHulsurkar我编辑了我的答案,这样你就可以有更多的信息来源,自己理解为什么这是个坏主意。