ФронтендJavaScriptHTML / CSS

Проверка надёжности пароля на JavaScript: шкала, подсказки и честные правила

Создаём индикатор надёжности пароля на JavaScript: оцениваем длину и разнообразие, показываем полезные подсказки, не запрещаем вставку и объясняем границы frontend-проверки.

Кодик

Автор

5 мин чтения

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

Правило «одна заглавная, одна цифра, один символ» легко превращается в предсказуемый пароль. Для учебного индикатора мы дадим длине самый большой вес, отдельно отметим разнообразие и предупредим о частых шаблонах. Это подсказка, а не криптографическая экспертиза.

1Считаем

Длина даёт основной вклад, классы символов добавляют баллы.

2Объясняем

Пользователь видит не запрет, а следующий полезный шаг.

3Не обещаем

Backend всё равно проверяет правила и хранит только стойкий хеш.

Какие признаки можно проверить в браузере

Функция evaluate принимает строку и возвращает score, label и массив hints. Интерфейс только отображает результат. Кнопка показа меняет type между password и text и обновляет aria-pressed. Вставку не блокируем: менеджеры паролей должны работать.

ПризнакБаллыКомментарий
12+ символов2Длина важнее замены букв на знаки
16+ символовещё 1Длинная фраза заметно лучше
Разные регистры1Дополнительное разнообразие
Цифра и символ1Не должны быть единственным правилом

После этого шага у каждой части есть одна роль. Интерфейс собирает действие, логика меняет состояние, а вывод показывает признак успеха. Это проще отлаживать, чем один большой обработчик.

От ввода к подсказке
Пароль не покидает компонент. На сервер уходит только отправленная форма по HTTPS

Сначала соберите минимальный сценарий. Не добавляйте оформление, хранение и дополнительные режимы одновременно. Добейтесь одного правильного прохода от входных данных до результата, а затем проверяйте каждое улучшение отдельно.

Пишем оценку и живую шкалу

Эта функция намеренно проста и объяснима. Она снижает оценку для нескольких очевидных шаблонов, но не знает утечки и словари всех языков. Для серьёзного продукта используйте проверенный оценщик и серверную политику.

function evaluate(password){
  let score=0;
  const hints=[];
  if(password.length>=12) score+=2; else hints.push('Используйте не меньше 12 символов');
  if(password.length>=16) score+=1;
  if(/[a-zа-я]/.test(password)&&/[A-ZА-Я]/.test(password)) score+=1;
  else hints.push('Добавьте буквы разного регистра');
  if(/\d/.test(password)&&/[^\p{L}\d]/u.test(password)) score+=1;
  else hints.push('Добавьте цифру и специальный символ');
  if(/password|qwerty|12345|пароль/i.test(password)){score=Math.min(score,1);hints.unshift('Не используйте распространённый шаблон')}
  const labels=['Очень слабый','Слабый','Средний','Хороший','Сильный','Сильный'];
  return {score,label:labels[score],hints};
}

const input=document.querySelector('#password');
const meter=document.querySelector('#strength');
const note=document.querySelector('#hint');
input.addEventListener('input',()=>{
  const result=evaluate(input.value);
  meter.value=result.score; meter.textContent=result.score + ' из 5';
  note.textContent=input.value?(result.label + '. ' + (result.hints[0]??'Хорошая длина и разнообразие.')):'Введите пароль';
});

document.querySelector('#reveal').addEventListener('click',event=>{
  const visible=input.type==='text'; input.type=visible?'password':'text';
  event.currentTarget.setAttribute('aria-pressed',String(!visible));
  event.currentTarget.textContent=visible?'Показать':'Скрыть';
});
Что должно работать после первого запуска

Оценка отделена от DOM и легко тестируется. Длина весит больше декоративной сложности. Подсказка называет одно конкретное улучшение. Кнопка показа доступна с клавиатуры и не ломает вставку.

Политика пароля
Помощь лучше механического запрета. Сравнение показывает, какой вариант легче поддерживать и проверять.

Почему зелёная полоска не гарантирует безопасность

Frontend-проверка видна пользователю и может быть обойдена прямым запросом. Сервер обязан повторить минимальные правила. Сам пароль нельзя логировать или хранить как обычную строку: сервер сохраняет результат специализированного медленного хеширования с солью.

Что делает компонентЧто он не делает
Показывает понятные подсказкиНе проверяет все известные утечки
Помогает выбрать длинуНе заменяет серверную валидацию
Разрешает менеджер паролейНе хранит пароль
Показывает или скрывает вводНе отправляет значение сам

Сохраняйте в одном месте то, что может измениться. Если одно и то же значение скопировано в три функции, после первой правки они начнут расходиться. Один объект состояния и одна функция отрисовки снимают эту проблему.

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

Практика: проверяем ввод и доступность

Проверьте пустую строку, 12 одинаковых букв, длинную фразу, qwerty12345 и вставку из менеджера паролей. Переключите видимость клавиатурой. Убедитесь, что пароль нигде не появляется в console.log, URL или тексте ошибки.

Проверка своими руками
  1. Введите короткий пароль из букв.
  2. Доведите длину до 12 символов.
  3. Проверьте qwerty12345 и слово «пароль».
  4. Вставьте длинную парольную фразу.
  5. Переключите видимость через Tab и Enter.
  6. Отправьте форму и повторите минимальную проверку на сервере.
Готово, если выполняются все пункты

Подсказка меняется на каждом input. Шкала имеет текстовую альтернативу. Вставка работает. Пароль не попадает в логи, URL и localStorage.

Что проверить
Компонент касается безопасности и доступности. Пройдите все четыре сценария перед публикацией проекта.

Доводим поле пароля до готового компонента

Следующий шаг для настоящей формы: автозаполнение current-password или new-password, серверная проверка и корректное сообщение об ошибке. Не заставляйте пользователя менять пароль по расписанию без причины и не запрещайте пробелы или вставку.

Запрещена вставка

Ломаются менеджеры паролей и длинные значения.

Только цветная полоска

Цвет не объясняет результат и недоступен части пользователей.

Проверка только в браузере

Её можно обойти прямым запросом.

Пароль пишется в localStorage

Секрет остаётся доступным скриптам страницы.

Сверьтесь с первичным источником. Поведение используемых функций и ограничения примера проверяйте по рекомендациями OWASP по аутентификации. Документация особенно важна, когда меняются версии, политика платформы или формат ответа API.

Что получится в итоге

Готовый результат проекта: Проверка надёжности пароля на JavaScript: шкала, подсказки и честные правила
Готовое поле показывает понятную шкалу, одну полезную подсказку и кнопку просмотра, не мешая вставке из менеджера паролей.

Короткие ответы
Что важнее для простой оценки?

Достаточная длина, а не обязательная замена каждой буквы специальным знаком.

Где повторяются правила?

На сервере, потому что frontend можно обойти.

Можно ли запрещать вставку?

Нет, это мешает менеджерам паролей и длинным уникальным паролям.

Как понять, что проект готов?

Он повторяет целевой сценарий несколько раз подряд, понятно реагирует на ошибочный ввод и не теряет состояние при обычных действиях.

Можно ли копировать код целиком?

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

Сделайте подсказку полезной, а обещание безопасности честным

Строки, регулярные выражения и события разбираются в курсе JavaScript. Форму можно соединить с Fetch API только после серверной валидации.

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