PHP注册:自动生成密码或让用户选择
在注册期间,我正在讨论如何设置用户密码:PHP注册:自动生成密码或让用户选择,php,security,passwords,registration,Php,Security,Passwords,Registration,在注册期间,我正在讨论如何设置用户密码: 让用户选择它。如果我这样做,我必须强制执行一些标准(长度、弱点、可能涉及正则表达式等)。当您选择这种方式时,通常会做什么?为什么?是否有一个PHP库可用于此目的 自动为用户生成密码,并将其发送到他们提供的电子邮件中。他们无法在没有密码的情况下登录,因此这也是电子邮件验证。问题是密码可能太难让用户记住。如果我允许他们把它改成更简单的东西,那就违背了我当初为他们选择它的目的。我还担心在电子邮件中传输密码(作为普通的未散列密码)的行为 我倾向于第二种,但在
- 让用户选择它。如果我这样做,我必须强制执行一些标准(长度、弱点、可能涉及正则表达式等)。当您选择这种方式时,通常会做什么?为什么?是否有一个PHP库可用于此目的
- 自动为用户生成密码,并将其发送到他们提供的电子邮件中。他们无法在没有密码的情况下登录,因此这也是电子邮件验证。问题是密码可能太难让用户记住。如果我允许他们把它改成更简单的东西,那就违背了我当初为他们选择它的目的。我还担心在电子邮件中传输密码(作为普通的未散列密码)的行为
编辑:根据答案,我选择第一个选项,让用户选择。我的问题是,我应该要求什么样的密码强度/长度/等等,以及如何强制执行?有PHP库可用于此吗?我认为只有一个答案让用户自己设置密码强> 其他一切都是程序员的懒散、糟糕的交互设计和对客户的友好(IMO) 现在我会看到一些例外,即如果它是一种低重要性的内部网系统,只有一大堆用户同意这一点,或者如果它是一个一次性帐户,人们以后不需要登录 不管怎样,你都需要对你的密码进行散列和加密,即使你自己生成了密码。 您只需要在用户第一次提交时添加一些验证规则。这可能比一个好的密码生成工具更容易实现 密码强度
一篇关于的帖子的链接我个人觉得,当访问密码以明文形式通过电子邮件发送到野外时,会非常恼人。此外,用户在任何情况下都有能力更改密码(我希望如此),因此会将其更改为您生成的密码以外的内容。因此,为什么不允许用户在注册时选择他/她想要的密码?当然,有必要指出弱密码(甚至可能不允许将其作为一个整体使用),但您实际上不必编写此检查的核心代码,因为有几十个现成的js库可以为您做到这一点。如果用户的想象突然变为空白,您始终可以建议使用随机密码。当然,您要确保生成的密码是“强”的(根据您的规则),并且会有一个“建议新密码”按钮 如果用户不想在不同的网站上使用复杂的密码或唯一的密码,那么他们总是会更改为您首先允许他们使用的密码。在这种情况下,您让他们不耐烦,因为您:
- 在电子邮件中发送了有效的密码/激活码
- 让他们检查他们的电子邮件收件箱(也许等待你的电子邮件到达)
- 让他们更改密码
最后建议:不要强迫;鼓励并强调大小密码的重要性。密码强度表是实现这一点的有趣方法之一。PHP密码强度。这个页面有一些基本的代码,它们是干净的代码,所以您应该能够修改它以满足您的需要。基于以下代码: 测试小写/大写/数字/非单词/至少8个字符。如果满足所有条件,则强度将等于5
$password = **HOW YOU GET THE PASS***($_POST['pass'])????;
$strength = 0;
// letters (lowercase)
if(preg_match("/([a-z]+)/", $password)) {
$strength++;
}
// letters (uppercase)
if(preg_match("/([A-Z]+)/", $password)) {
$strength++;
}
// numbers
if(preg_match("/([0-9]+)/", $password)) {
$strength++;
}
// non word characters
if(preg_match("/(W+)/", $password)) {
$strength++;
}
// longer than 8 characters
if(strlen($password) > 8)) {
$strength++;
}
if ($strength >= 5)
print "woo hoo";
else
print "bah";
这里是用字母值生成密码的代码
function genRandomString() {
$length = 8;
$characters = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
$string = "";
for ($p = 0; $p < $length; $p++) {
$string .= $characters[rand(0, strlen($characters))];
}
return $string;
}
拥有一个复杂的密码不会增加你的安全性,因为你的用户会进行复制和粘贴,或者他们会用你的密码在办公桌上做笔记…@Ghommey:虽然复杂的密码不会增加用户端的安全性,但它确实增加了网络的安全性。这意味着,例如,针对该站点的字典攻击将不起作用。虽然这可能是一个相当理论化的观点。总体而言,我反对密码作为一个概念。考虑使用OpenID(类似于这个站点)使用通过EMAIL发送的哈希链接。OpenID很好,但是您需要OpenID的密码:)@ Cops:OpenID是很棒的…除非您与普通公众而不是StackOverflow用户合作。:)很好,从用户的角度来看,这将是一个完美的解决方案。
$mailPass =genRandomString();