Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP注册:自动生成密码或让用户选择_Php_Security_Passwords_Registration - Fatal编程技术网

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();