Проверка за сила на парола
13-12-2009
Така... За този скрипт съм използвал библиотеката jQuery за AJAX ефектите. Повече информация за нея можете да намерите на официалния сайт http://jquery.com .
Така ще започна със файла със функциите - passCheck :

<?php
@header("Content-Type: text/html; charset=windows-1251");
function checkStrength($password)
{
if (strlen($password) == 0)
{
return false;
}

$passStrength = 0;

$length = strlen($password); //Взимаме дължината на паролата

// Проверяваме дали паролата не е само от малки букви
if(strtolower($password) != $password)
{
$passStrength += 4;
}

//Проверяваме дали паролата не е само от главни букви
if(strtoupper($password) == $password)
{
$passStrength += 4;
}

//Проверяваме дали паролата е м/у 8 и 15 символа
if($length >= 8 && $length <= 15)
{
$passStrength += 3;
}

//Проверяваме дали паролата е м/у 16 и 35 символа
if($length >= 16 && $length <=35)
{
$passStrength += 5;
}

//Проверяваме дали паролата е над 35 символа
if($length > 35)
{
$passStrength += 6;
}

//Взимаме числата от паролата
preg_match_all('/[0-9]/', $password, $numbers);
$passStrength += sizeof($numbers[0]) * 2; // Умножаваме броя на числата по 2

// Проверяваме за специални знаци
preg_match_all('/[|!@#$%&*\/=?,;.:\-_+~^\\\]/', $password, $specialchars);
$passStrength += sizeof($specialchars[0]) * 2; // Умножаваме броя на специалните символи по 2

//Броим уникалните символи в паролата
$chars = str_split($password);
$num_unique_chars = sizeof( array_unique($chars) );
$passStrength += $num_unique_chars * 3; //Умножаваме броя на уникални символи по 3

$passStrength = $passStrength > 99 ? 99 : $passStrength; // Проверяваме дали $strength е по-голямо от 99
$passStrength = floor($passStrength / 10 + 1); // Делим полученото число на 10 и събираме с 1

switch ($passStrength){
case 1: case 2: case 3:
$strengthWords = "Слаба";
break;
case 4: case 5: case 6:
$strengthWords = "Средна";
break;
case 7: case 8:
$strengthWords = "Силна";
break;
case 9: case 10:
$strengthWords = "Много силна";
break;
}

return $strengthWords;
}

function genPass($minchars=5, $maxchars=7, $usesymbol=0)
{
$chars="ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890abcdefghijklmnopqrstuvwxyz"; //символите, които искате да се появяват във паролата.

if ($usesymbol == 1){
$chars .= "!@#$%^&*()_+";
}

$i=0;

$repeat=mt_rand($minchars,$maxchars); //рандом стойност м/у двете избрани чрез параметрите зададени на функцията. По подразбиране м/у 5 и 7

// Докато $i е по-малко от $repeat
while ($i<$repeat)
{
$randompass.=$chars[mt_rand(1, strlen($chars)-1)]; //избираме си рандом символ от всички горепосочен
$i+=1;
}

echo $randompass;
}


if ($_REQUEST['parola']){
$password = $_REQUEST['parola'];
echo checkStrength($password);
}

if ($_REQUEST['newparola']){
echo genPass(10, 14, 1);
}

?>

Тук имаме 2 функции. Едната - checkStrength. Тя проверява силата на Вашата парола чрез прост алгоритъм. Отначало се задава една промелива $passStrength със стойност 0. Постепенно тази стойност се увеличава в зависимост от няколко неща: Съотношение между големи и малки букви, дължината на паролата, съдържанието на цифри във паролата, съдържанието на специални знаци във паролата (от сорта на !@#$ и т.н.) и уникалните символи в паролата. Накрая стойността на $passStrength се дели на 10 и се закръглява. Получава се число от 1 до 10, колкото по-високо е то, толкова по-силна е паролата. Има 1 параметър $password - Това е паролата зададена от потребителя.

Втората функция е genPass. Тук имаме 3 параметъра.
1. $minchars - минималните символи за генерираната парола. По подразбиране е 5.
2. $maxchars - максималните символи за генерираната парола. По подразбиране е 7.
3. $usesymbol - този параметър приема две стойности 0 и 1, като по подразбиране е 0. Когато стойността му е 0 във паролата ви няма да се появяват символите !@#$%^&*()_+, ако е 1 тези символи ще бъдат на разположение.

На края на файла виждаме две проверки. Те проверяват дали има заявка от AJAX-а.

Ще продължа със JS файла main.js :


$(document).ready(function(){
$("#pass").keyup(function(){
$.ajax({
type: "POST",
url: "passCheck.php",
data: ({
parola: $("#pass").val()
}),
contentType: "application/x-www-form-urlencoded;charset=windows-1251",
success:function(data) {
$("#checkParola").text(data);
}
});
});

$("#newpass").click(function(){
$.ajax({
type: "POST",
url: "passCheck.php",
data: ({
newparola: 1
}),
contentType: "application/x-www-form-urlencoded;charset=windows-1251",
success:function(data) {
$("#newParola").text(data);
}
});
});
});

Нищо специално. Проверката за силата на паролата се изпраща при евент onKeyUp във елемента със id - pass. В случая този елемент е текстово поле. Евентът onKeyUp е моментът, когато пуснете копчето на клавиатурата. Праща една POST заявка със стойност parola. И показва отговора от сървъра във елемент със id - checkParola.

Втората функция се изпълнява при натискането на елемент с id - newpass. Пак праща POST заявка, но със стоност newpass. Отговорът от сървъра се получава във елемент с id - newParola.

И двете заявки се пращат във файла passCheck.php

Ето как изглежда и индекса:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<title>Валидация на формуляр...</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
<script src="main.js" type="text/javascript"></script>
</head>

<body>
<form name="proveri" action="" method="post">
Парола: <input type="text" name="parola" id="pass" />
<div id="checkParola"></div><br />
<input type="button" name="genNewPass" id="newpass" value="Генерирай парола" />
<div id="newParola"></div>
</form>
</body>

</html>






/ Трябва да сте регистриран за да напишете коментар /
От: vencivip
14:27 13-12-2009
Браво
От: ventsi_konov
9:39 19-01-2011
Много полезно, благодаря :)
От: ventsi_konov
23:32 19-01-2011
А как мога да използвам HTML тагове във връщащия резултат? Например
"Слаба" да е оцветено в червено, а "Много силна" в зелено, понеже като променя просто думите, се връща както трябва резултата,обаче не го чете браузъра, а излиза като стринг.
От: trevata
18:12 23-01-2011
Просто заменяш
$("#checkParola").text(data);
със
$("#checkParola").html(data);
От: ivcho02
18:56 23-05-2011
На мен ми излизат грешки

Notice: Undefined index: parola in C:\Program Files\EasyPHP-5.3.6.0\www\a\passCheck.php on line 101 Notice: Undefined variable: randompass in C:\Program Files\EasyPHP-5.3.6.0\www\a\passCheck.php on line 93 4xug937IUFJ3f
1