Проверка стойкости пароля на 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
Пароль “123456789” признан высокой степени стойкости, как и “!!!!!!!!!!!!!!!!!” и прочие подобные…
“qwerty” - средняя? %) Ну-ну….
Алгоритм расчета балла можешь без труда изменить самостоятельно в файле estimate_pass.php
Всё уж давно написано: пользуйтесь, только баллы свои поставьте вместо 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’Такие лёгкие пароли не катят';
Интересно.
Зачетная статья.
Удобно использовать как примитивную чекалку для регистрации на сайте. Заставит посетителя слегка задуматься над пассом.
Спасибо тебе novice за полезный пост
Спасибо за полезную статью. Попробую реализовать данный скрипт на Joomla - сайте в модуле авторизации.
microsoft.com/security/pc-security/password-checker.aspx?WT.mc_id=Site_Link
Тут можно посмотреть исходный код, выковыривайте скрипт и пользуйтесь… Проверил, все адекватно работает. Только в скрипте пользуйтесь первым, а не вторым, который сейчас работает на сайте.
Сложность пароля. Два пути - развилка сложности. Первый путь, простой - оценивать сложность пароля как сумму сложностей его составных частей. Второй путь, сложный - оценивать сложность пароля как целого с некоторой планкой. Например логика установки планки повыше - aabb, aababcbcc, aababcabcdbcdcdd, aababcabcdabcdebcdecdedee, и т. д.