• Спонсоры

  • Рубрики

  • Архивы

  • Популярное



Проверка стойкости пароля на 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, и т. д.

Оставить комментарий


© 2008 - 2017 i-novice.net | Все права защищены.