验证密码与在PHP的preg_match(validate password with preg_m

2019-09-27 01:38发布

我需要验证密码。 我目前使用: preg_match("/^[a-z0-9_-]*$/i", $pass)

我想补充的长度这一点。 我的MySQL表设置这样的: userpassword varchar (40) NOT NULL, 所以字符6和40之间。 而且我想,让那些没有危险把我的数据库中的所有字符。

Answer 1:

对密码施加任意复杂的规则是非常用户敌对且基本不会提高安全性。 不这样做。

这也是为什么觉得上面的说法是正确的:

  • 如果我想使用你的网站以“123456”为我的密码,这是我的问题。 让我一起摇摆。
  • 你可以处以最小长度(例如,6个字符),但不是最大。 如果我想引用整个约翰·梅纳德·我的密码,让我一起摇摆。
  • 您的“安全”密码的想法可能不是其他人的想法。
  • 人们可能会使用密码生成器不能自动遵守规则集。 不要不接受他们的密码,没有别的原因,没有足够含/或太多的“特殊字符”给他们带来困扰。
  • 必须使用哈希客户的密码体面散列算法,加上随机哈希盐 ,为每一位用户的不同。 只有在数据库存储哈希盐和散列, 绝不会存储明文密码。
  • 一旦散列,甚至跛密码防盗合理的安全/开裂。 实施打击蛮力攻击(基于时间的停工,基于IP的停工,与电子邮件握手检索锁定帐户密码锁)的安全性。

所以,你的密码验证的过程是这样的

  • 新用户? 输入用户名和随机盐创建用户记录(永远不会改变该用户的盐值)
  • 返回用户? 从DB取盐,再散了密码,比较结果在DB哈希。
  • 切勿将用户的密码任何地方物理和使用HTTPS传送。
  • 如果你不想做这样的事情上面,考虑使用OAuth的与您的网站。 可能不是容易的事,但你不必担心密码的安全性再您的用户少了一个密码,要记住。

对于参数的缘故,这个正则表达式会做什么你问。 如果你还是不顾一切地去做。

preg_match("/^[a-z0-9_-]{6,40}$/i", $pass)


Answer 2:

你应该确保他们的安全,不是他们太不安全验证您的密码。

public function password_is_secure($password) {
  // quick obvious test
  if (is_numeric($password)) {
    // FAIL: 'Your password cannot be all numbers.'
  } elseif (strlen(count_chars($password, 3)) < 4) {
    // FAIL: 'Your password needs to have a variety of different characters.'
  }

  // levenshtein distance test (test similarity to common passwords)
  $name = $_POST['name'];
  $email = $_POST['email'];
  $badPasswords = array($name, $email, 'password', 'password1', 'password123', '1234abcd', 'abcd1234', '12345678', '1234567890');

  foreach($badPasswords as $bad) {
    if (levenshtein($password, $bad) < 6) {
      // FAIL: 'Your password is too similar to your name or email address or other common passwords.'
    }
  }

  return true;
}

插件进行更适当的“干将” $name$email和设置您希望如何处理传递错误信息,以及上面的方法将做你一个公道。 你可以在“调”是通过改变允许Levenschtein距离(目前是6)。

我还建议延长列表$badPasswords包括一堆的最常用的密码 。

而对于一些神,盐的爱和散列你的密码,你将它们存储在数据库之前。



Answer 3:

我想给你以下建议:

的OpenID,Facebook连接

应该在你的数据库中存储密码 。 使用OpenID的通过很容易LightOpenID和理由如下:

  • 当您使用一个OpenID提供商,然后你不存储密码(错误地)所以不可能被窃取的密码 。
  • 您的用户不必创建另一个帐户登录到您的网站。
  • 良好的OpenID提供商SSL到位,使你的密码是通过线路以纯文本不发送。

最好别

PS:对于它的乐趣。 别人问我stackoverflow.com如果他的loginsystem是什么好/安全的(它没有),所以我写了一个安全登录系统 。 如果您使用SSL(如果我没有错过任何漏洞,但我不相信我做了)。

  • 使用phpass来存储你的密码安全 。
  • 使用SSL,以确保您的密码不是纯文本通过网络发送。
  • 不要使用mysqli的, 但使用PDO来代替 。 这样,你已经对XSS保护时使用预处理语句。 这是文章:“ 为什么你应该使用PHP的数据库访问PDO ”是一个很好的介绍。

长/安全

我想补充的长度这一点。 我的MySQL表设置这样的:userPassword的VARCHAR(40)NOT NULL ,. 所以字符6和40之间。 而且我想,让那些没有危险把我的数据库中的所有字符。

我不喜欢正则表达式,因为它们过于复杂(我只用作为最后的努力)。 我会建议你只使用一个最新版本的PHP(> 5.2.0),它具有保护到位,使其安全免受XSS 。

过滤器扩展功能默认情况下为PHP 5.2.0启用。 这一次使用的实验PECL扩展之前,然而,PECL版本不再推荐或更新。

接着验证长度是如使用简单的strlen功能。



Answer 4:

你应该散列密码,如果你的数据库被盗取,如果你不攻击者可以读出所有的密码。

更新:检查托默勒格一职

      sha1($_POST['pass']); // will encrypt the password to a 40 character long string.
      echo(sha1('monkey')); // will become:          ab87d24bdc7452e55738deb5f868e1f16dea5ace
      echo(sha1('Monkey')); // completely different: 4bd0ec65b8f729d265faeba6fa933846d7c2d687
      // Just by making the letter upper-case!

如果你想登录用户加密的登录表单通,并将其与数据库中。

      $pass = 'monkey';
      if(sha1($pass)=='ab87d24bdc7452e55738deb5f868e1f16dea5ace'){
          echo('Correct pass!');
      } 

如果你想验证密码的长度,你可以使用这段代码:

    if($upass=='' || $upass=='Password'){
        $errupass = 'Please fill in a password.';
        $valid = false;
    }elseif(strlen($upass)<6){
        $errupass = 'Password must be atleast 6 characters.';
        $valid = false;
    }

我不应该阻止人们,因为他们增加密码的强度用奇怪的字符。



Answer 5:

好吧,首先,你会不会把以纯文本的密码进入你的数据库,你会被加密散列首先它开始。 因此,你真的不关心哪些字符或不危险把你的数据库,你会得到一个固定长度的字母数字字符串。

散列之前,您的正则表达式将是这样的:

/^([a-zA-Z0-9]{6,40})$/

...把任何你想要的字符,可以让在字符类括号您的密码。

其次,你真的不关心你放什么字符到你的数据库,你会使用在你的插入查询占位符,对不对?



文章来源: validate password with preg_match in php