Как правильно проверять сложность пароля пользователя при регистрации

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

За десятилетия айтишки сложилась практика ограничивать пользователей в сложности их паролей. Сейчас пароль пользователя должен:

  • быть не меньше N символов

  • && быть не больше M символов (чуть реже встречается такое правило)

  • Содержать хотя бы одну большую букву

  • Содержать хотя бы одну маленькую букву

  • Содержать хотя бы одну цифру

  • Содержать хотя бы один спецсимвол

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

Уж где мы только не подстелили соломы для наших нерадивых пользователей, лишь бы они были в безопасности. Ведь и мы, и матанализ, и различные софтинки – все наперебой говорят, что пароль qwerty и пароль W0wS3qur3P/-\$$ имеют кардинально разную подборостойчивость...

Алгоритм везде один и тот же. К слову, обычно проверка на спецсимволы производится "хотя бы однин символ из заранее захардкоженного словаря". Обычно, словарь вида "не буквы и не цифры с обычной клавиатуры английской раскладки". Просто курсор в кавычки константы, глазки на клавиатуру – и погнали составлять наш шикарнейший словарь.

Данный алгоритм настолько распространён, что встречается почти что в каждой первой статье. Примеров подобных статей – тысячи. Есть даже на хабре (в примере кода можно заметить ту самую регулярку).

Однако, всё ли у нас в порядке с нашим алгоритмом?

Что есть спецсимвол?

Дисклеймер: примеры кода будут на пыхе, для простоты забудем про ограничения длины пароля

Типовой шаблон для поиска спецсимволов выглядит в лучшем случае вот так:

$password = 'fF6:';
var_dump(preg_match('/[\.:,;\?!@#\$%\^&\*_\-\+=]/', $password));
//true

А что если скобка?

<?php
$password = 'fF6:(';
var_dump(preg_match('/[\.:,;\?!@#\$%\^&\*_\-\+=]/', $password));
//false

Ок, не проблема, добавим в словарь ещё и все скобки

<?php
$password = 'fF6:(';
var_dump(preg_match('/[\.:,;\?!@#$%^&\*_\-\+=\(\)<>{}\[\]]/', $password));
//true

А как же слэш?

<?php
$password = 'fF6:(/';
var_dump(preg_match('/[\.:,;\?!@#\$%\^&*_\-\+=\(\)<>{}\[\]]/', $password));
//false

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

<?php
$password = 'fF6:(/';
var_dump(preg_match('/[\.:,;\?!@#\$%\^&\*_\-\+=\(\)<>{}\[\]\'"`\/_~|\\]/', $password));
//true

И вроде мы собой довольны, однако... "•√π÷׶∆£¢€¥°©®™✓". Вот лишь некоторые символы, которые я слишком легко могу ввести со стандартной GBoard клавиатуры на своём телефоне. Буквально два нажатия: открыть клавиатуру символов и перейти на вторую страницу. Это уже не говоря о различных альтернативах вроде длинного и очень длинного тире (также известные как &ndash; (–) и &mdash; (—)). Что, опять словарь дополнять? Кстати, если переключить перед этим раскладку клавиатуры – то гборд даже поменяет некоторые символы. То есть мы уже видим проблему множества раскладок. А теперь ещё можно вспомнить про то, что есть другие клавиатуры, и даже другие операциооные системы, у которых свои клавиатуры. Ну и на сладенькое...

Источник: https://habr.com/ru/post/714478/


Интересные статьи

Интересные статьи

Возможно вы думаете обработка таких исключений происходит как обычно в Kotlin/Java коде. К сожалению, при использовании вложенных корутин, все может работать не так как ожидается.В этой статье я попро...
Я долго выбирал, начать расписывать все «от плинтуса», или заведомо предположить, что читатель знаком хотя бы с тремя произведениями: 1. Сергей Викторович Ковалев: «Психотерапия человеческой жизни....
Привет, Хабр! На написание этого поста меня вдохновил другой пост TDD есть опиум для народа, где обсуждаются спорные моменты в подходе TDD и в принципе делается вывод о его несостоятельности (хотя и п...
Никто не любит, когда человек бросает все и уходит. Я говорю не (только) о ситуации, когда тренер школьной команды норовит пристыдить спортсмена, который решает её покинуть. Я имею в виду...
Подготавливая документы для нового сборника, я обратил внимание на аналитику, что в 60е подготовил Арвид Владимирович Палло (достаточно известный конструктор).