Проверка стойкости пароля на AJAX

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

Каждый день появляются все новые виды ресурсов вроде социальных сетей и других интерактивных сервисов, где нужно регистрироваться, оставляя свои пароли.

С ростом числа сервисов, которыми пользуется человек, растет и количество паролей, которые он применяет при регистрации (если он не использует один и тот же во всех случаях). Хранить большое кол-во паролей в голове – дело непростое для неподготовленных пользователей, поэтому решается такая проблема в большинстве случаев путем генерации легкозапоминающихся паролей. Между тем, большинство пользователей и не подозревает, чем это может обернуться для них в случае неблагоприятного развития событий.

Ладно, не буду ходить вокруг да около и перейду все-таки к теме :) В этой статье я рассмотрю один прием, с помощью которого можно напоминать вашим пользователям о безопасности. А именно - добавлю в форму регистрации индикатор стойкости пароля на ajax.

Алгоритмов проверки на стойкость пароля можно придумать огромное количество, но прежде чем их придумывать, надо установить – стойкими по отношению к чему будут пароли? Например, есть пароль “q1_1d79sdf_vcbsqwezx” – на первый взгляд этот пароль довольно стойкий. Но если его получит злоумышленник в открытом тексте, то его стойкость будет равна нулю. Поэтому по отношению к таким видам атак, этот пароль стойким не будет.
А вот к атакам типа подбора по словарю или перебору (brute force), этот пароль будет очень стойким.

Так как второй вид атак является самым частым, то рассматривать стойкость пароля я буду по отношению к нему.

Здесь есть несколько факторов, которые влияют на стойкость:

  • длина пароля
  • использование цифр
  • использование не буквенных символов (цифры, тире, подчеркивание)
  • использование букв разных регистров внутри пароля

Ими и будем руководствоваться.

Теперь переходим к практике.
Рассмотрим простую форму с логином и паролем.

<form action="index.php" method="post">
Логин: <br />
<input type="text" name="login" /><br />
Пароль: <br />
<input type="password" name="pass" /><br />
<input type="submit" value="Login" />
</form>

Теперь добавим в нее код для индикатора. Получим такую страницу:

<html>
<head>
<title>Authorization</title>
<style>
#secure { display:none; }
#low, #medium, #high { font-weight:bold; }
#low { color:red; }
#medium { color:yellow; }
#high {	color:green; }
</style>
</head>
<body><form action="index.php" method="post">
Логин: <br />
<input type="text" name="login" /><br />
Пароль: <br />
<input type="password" name="pass" /> <span id="secure">Стойкость : <span id="low">Low</span><span id="medium">Medium</span><span id="high">High</span></span><br />
<input type="submit" value="Login" />
</form>
</body>

Индикатор будет показывать текущий уровень стойкости по мере ввода пароля.
Теперь самое интересное. Напишем несколько javascript функций, которые будут передавать php-скрипту текущий пароль, получать в ответ уровень стойкости (от 0 до 2) и, в зависимости от этого уровня показывать нужное слово (Низкая, Средняя, Высокая).

<script>$(document).ready(function(){
 $('input#password').keyup(function(){
 	EstimatePass();
 });
});
function EstimatePass() {
var password = $('#password').attr('value');
if (password == '') {
$('#secure').hide();
} else {
$('#secure').show();
 	$.getJSON('estimate_pass.php',
 				{pass:password},
 				function(obj) {
 					ShowLevel(obj.level);
 				});
}
}
function ShowLevel(level) {
if (level == 0) {
 	$('#low').show(); $('#medium').hide(); $('#heigh').hide();
 }
 if (level == 1) {
 	$('#low').hide(); $('#medium').show(); $('#heigh').hide();
 }
 if (level >= 2) {
 	$('#low').hide(); $('#medium').hide(); $('#heigh').show();
 }
}
</script>

Обратите внимание, что обработчик реагирует на событие keyup (чтобы пользователь успел ввести символ, а только потом текст из поля передавался php-скрипту).
А вот и сам php-скрипт:

<?
 $pass = $_REQUEST['pass'];
 $strong = 0;	if (strlen($pass) >= 6) {
 	$strong += 1;
 }
if (strlen($pass) >= 12) {
 	$strong += 1;
 }
if (preg_match('/[A-Z]/', $pass) && preg_match('/[a-z]/', $pass)) {
 	$strong += 1;
 }
if (preg_match('/[0-9]/', $pass)) {
 	$strong += 1;
 }
echo '{level:'.$strong.'}';
?>

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

Другие пишут:

  • Оценка сложности пароля на javascript




Читайте также:



7 Ответов на “Проверка стойкости пароля на AJAX”

  1. Пароль “123456789” признан высокой степени стойкости, как и “!!!!!!!!!!!!!!!!!” и прочие подобные…
    “qwerty” - средняя? %) Ну-ну….

  2. novice

    Алгоритм расчета балла можешь без труда изменить самостоятельно в файле estimate_pass.php

  3. Всё уж давно написано: пользуйтесь, только баллы свои поставьте вместо return false;
    [php]
    <?php
    //Проверка пароля на сложность
    function checkpass($p,$minlen=5)
    {
    if(strlen($p)<$minlen)return false;
    $flag=0;
    $lastchar=$p[0];
    for($i=1;$i<strlen($p);$i++)
    {
    if($p[$i]==$lastchar)$flag++;
    if($flag==2)return false;//3 одинаковых символа подряд
    if($p[$i]!=$lastchar)$flag=0;
    $lastchar=$p[$i];
    }

    $abc[]=’abcdefghijkmnopqrstuvwxyz';
    $abc[]=strrev(‘abcdefghijkmnopqrstuvwxyz’);
    $abc[]=’абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
    $abc[]=strrev(‘абвгдеёжзийклмнопрстуфхцчшщъыьэюя’);
    $abc[]=’абвгдежзийклмнопрстуфхцчшщъыьэюя';
    $abc[]=strrev(‘абвгдежзийклмнопрстуфхцчшщъыьэюя’);
    $abc[]=’абвгдеёжзиклмнопрстуфхцчшщъыьэюя';
    $abc[]=strrev(‘абвгдеёжзиклмнопрстуфхцчшщъыьэюя’);
    $abc[]=’абвгдежзиклмнопрстуфхцчшщъыьэюя';
    $abc[]=strrev(‘абвгдежзиклмнопрстуфхцчшщъыьэюя’);
    $abc[]=’qwertyuiop[]';
    $abc[]=strrev(‘qwertyuiop[]’);
    $abc[]=’asdfghjkl;\”;
    $abc[]=strrev(‘asdfghjkl;\”);
    $abc[]=’zxcvbnm,./';
    $abc[]=strrev(‘zxcvbnm,./’);
    $abc[]=’йцукенгшщзхъ';
    $abc[]=strrev(‘йцукенгшщзхъ’);
    $abc[]=’фывапролджэ';
    $abc[]=strrev(‘фывапролджэ’);
    $abc[]=’ячсмитьбю.';
    $abc[]=strrev(‘ячсмитьбю.’);
    $abc[]=’Ё!”№;%:?*()_+/';
    $abc[]=strrev(‘Ё!”№;%:?*()_+/’);
    foreach($abc as $line)if(strpos($line,strtolower($p))!==false)return false;//Провека на последовательные нажатия клавиш
    if($p==intval($p))
    {
    //return false;//Запрет паролей только из цифр
    $lastchar=$p[0];
    $dl=$lastchar-$p[1];
    $flag=true;
    for($i=1;$i[/php]
    Юзать как if(!checkpass($password))echo’Такие лёгкие пароли не катят';

  4. j0hndoe

    Интересно.
    Зачетная статья.
    Удобно использовать как примитивную чекалку для регистрации на сайте. Заставит посетителя слегка задуматься над пассом.
    Спасибо тебе novice за полезный пост :)

  5. Спасибо за полезную статью. Попробую реализовать данный скрипт на Joomla - сайте в модуле авторизации.

  6. fedya

    microsoft.com/security/pc-security/password-checker.aspx?WT.mc_id=Site_Link

    Тут можно посмотреть исходный код, выковыривайте скрипт и пользуйтесь… Проверил, все адекватно работает. Только в скрипте пользуйтесь первым, а не вторым, который сейчас работает на сайте.

  7. maodouru

    Сложность пароля. Два пути - развилка сложности. Первый путь, простой - оценивать сложность пароля как сумму сложностей его составных частей. Второй путь, сложный - оценивать сложность пароля как целого с некоторой планкой. Например логика установки планки повыше - aabb, aababcbcc, aababcabcdbcdcdd, aababcabcdabcdebcdecdedee, и т. д.


© Copyright. . I-Novice. All Rights Reserved. Terms | Site Map