подтвердить пароль с помощью preg_match в php - PullRequest
1 голос
/ 25 января 2011

Мне нужно проверить пароли. В настоящее время я использую: preg_match("/^[a-z0-9_-]*$/i", $pass).

Я бы хотел добавить к этому длину. Моя таблица mysql настроена так: userpassword varchar (40) NOT NULL,. Так что от 6 до 40 символов. И я хотел бы разрешить всем персонажам, которые не опасны, поместить в мою базу

Ответы [ 5 ]

8 голосов
/ 25 января 2011

Наложение произвольных правил сложности на пароли очень враждебно для пользователя и существенно не повышает безопасность. Не делай этого.

Вот почему Я думаю, что приведенное выше утверждение верно:

  • Если я хочу использовать ваш сайт с паролем "123456", это моя проблема. Позвольте мне катиться с этим.
  • Вы можете установить минимальную длину (например, 6 символов), но не максимальную. Если я хочу привести в качестве моего пароля весь Джон Мейнард , позвольте мне использовать его.
  • Ваша идея о "безопасном" пароле может быть не чужой идеей.
  • Люди могут использовать генераторы паролей , которые не соответствуют вашему набору правил автоматически. Не раздражайте их тем, что не принимаете их пароль ни по какой другой причине, кроме того, что в них недостаточно / или слишком много «специальных символов».
  • Вы должны хэшировать пароли своих клиентов с алгоритмом приличного хэширования плюс случайная хеш-соль , различная для каждого пользователя. Храните только хэш-соли и хэши в базе данных, никогда храните пароли в открытом виде.
  • После хеширования даже неудачный пароль достаточно надежно защищен от кражи / взлома. Обеспечить защиту от атак методом перебора (блокировка по времени, блокировка по IP-адресу, блокировка паролем с помощью рукопожатия при получении заблокированной учетной записи).

Итак, ваш процесс проверки пароля идет так

  • Новый пользователь? Создать запись пользователя с именем пользователя и случайной солью (никогда не меняйте значение соли для этого пользователя)
  • Вернувшийся пользователь? Извлеките соль из БД, повторно хэшируйте его пароль, сравните результат с хешем в БД.
  • Никогда не храните пароль пользователя где-либо физически и используйте HTTPS для его передачи.
  • Если вы не хотите делать что-то подобное, подумайте об использовании OAuth с вашим сайтом. Также это может быть непросто, но вам больше не нужно беспокоиться о безопасности пароля и у ваших пользователей есть на один пароль меньше, чтобы запомнить.

Ради аргумента, это регулярное выражение будет делать то, что вы просите. Если вы все еще отчаянно пытаетесь это сделать.

preg_match("/^[a-z0-9_-]{6,40}$/i", $pass)
2 голосов
/ 25 января 2011

Я хотел бы дать вам следующие советы:

OpenID, Facebook Connect

вы должны не быть хранить пароли в вашембаза данных.Используйте OpenID через действительно простой LightOpenID и по следующим причинам:

Лучше не

PS: для удовольствияЭто.Кто-то еще спросил меня на stackoverflow.com, была ли его система входа в систему хороша / безопасна (это было НЕ), поэтому Я написал БЕЗОПАСНУЮ систему входа в систему .Если вы используете SSL (и если я НЕ пропустил ни одной уязвимости, но я НЕ верю, что я это сделал).

длина / безопасно

Я быхотел бы добавить длину к этому.Моя таблица mysql настроена так: userpassword varchar (40) NOT NULL ,.Так что от 6 до 40 символов.И я бы хотел, чтобы все символы, которые не опасны, были добавлены в мою базу данных.

Я НЕ люблю регулярные выражения, потому что они слишком сложны (я использую только в качестве последнего усилия).Я бы посоветовал вам просто использовать последнюю версию PHP (> 5.2.0), которая имеет защиту для защиты от XSS .

Расширение фильтрапо умолчанию включено в PHP 5.2.0.До этого времени использовалось экспериментальное расширение PECL, однако версия PECL больше не рекомендуется и не обновляется.

Следующая длина проверки так же проста, как использование функции strlen .

2 голосов
/ 25 января 2011

Вы должны проверить свои пароли, убедившись, что они безопасны, а не что они небезопасны.

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 и настройте способ обработки передаваемых сообщений об ошибках, а вышеприведенный метод даст вам некоторую справедливость. Вы можете «настроить» его, изменив допустимое расстояние Левенштейна (в настоящее время 6).

Я бы также рекомендовал расширить список $badPasswords, включив в него набор самых распространенных паролей .

И ради любви к какому-то божеству, запишите и хэшируйте свои пароли перед тем, как сохранить их в базе данных.

1 голос
/ 25 января 2011

Вы должны хешировать пароли, если ваша база данных взломана, злоумышленник может прочитать все пароли, если вы этого не сделаете.

ОБНОВЛЕНИЕ: Проверьте сообщение Томалак

      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;
    }

Я не должен отговаривать людей использовать странные символы, так как они увеличивают надежность пароля.

0 голосов
/ 25 января 2011

Ну, для начала, вы не будете вводить пароль в виде обычного текста в вашу базу данных, так как сначала будете криптографически его хэшировать. Таким образом, вы на самом деле не заботитесь о том, какие символы являются или не являются опасными для помещения в вашу базу данных, поскольку вы получите буквенно-цифровую строку фиксированной длины.

Ваше регулярное выражение перед хэшированием будет выглядеть примерно так:

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

... помещая любые символы, которые вы хотите разрешить в паролях, в скобках класса символов.

Во-вторых, вас не волнует, какие символы вы поместите в базу данных, так как вы будете использовать заполнители в запросе вставки, верно?

...