用php写密码输入强度,一个用php实现密码强度检测的类

本文介绍了如何通过编程实现密码强度检测,定义了不同强度的规则,并用PHP构建了pass_rule.php、pass_policy.php和pass_check.php文件,展示了面向对象的编程方法和正则表达式在密码验证中的应用。
摘要由CSDN通过智能技术生成

首先,定义出密码强度的分类: 弱密码:

长度至少为6个字符

中等强度密码:

长度至少为6个字符

不能包含用户的帐户名

包含密码字符集(数字,小写字母,大写字母,特殊字符)3类字符

高等强度密码:

长度至少为7个字符

包含密码字符集中4类字符

为了让密码检测更具有可扩展性,决定按一下方式构建类:

pass_rule.php密码强度规则文件,修改此文件就可以实现不同的密码强度检测方式

define("UNVALID", 0);

define("WEAK", 1);

define("MIDDLE", 2);

define("STRONG", 3);

/*

* pass rule array(

*rule_name => array("type", "param", "judge condition"),

* )

*/

$pass_rules = array(

"r1" => array("len", "6", ">="),

"r2" => array("len", "7", ">="),

"r3" => array("match", "", "exclude"),

"r4" => array("char_class", "[a-z]", "include"),

"r5" => array("char_class", "[A-Z]", "include"),

"r6" => array("char_class", "[0-9]", "include"),

"r7" => array("char_class", "[~`!@#$%^&*()/-_+={}/[/]|//:;/"'<>,.?//]", "include"),

);

//basic conditions of diff level

$pass_levels = array(

UNVALID => array(),

WEAK => array("len" => "r1"),

MIDDLE => array("len" => "r1", "match" => "r3", "char_class" => "3"),

STRONG => array("len" => "r2", "match" => "r3", "char_class" => "4"),

);

pass_policy.php密码策略文件,定义了通常的检测操作,可根据传入的规则进行检测动作

class pass_intensity_policy

{

private $rules;

function pass_intensity_policy($rules){

$this -> rules = $rules;

}

function check($pass, $user){

$result = array("len" => "", "match" => "", "char_class" => "");

$i = 0;

foreach ($this -> rules as $k => $v) {

if ($v[0] == "len") {

if ($this -> opt_len($pass, $v[1], $v[2]))

$result["len"] .= $k;

}

if ($v[0] == "match") {

if ($this -> opt_match($pass, $user, $v[2]))

$result["match"] = $k;

}

if ($v[0] == "char_class") {

if ($this -> opt_char_class($pass, $v[1], $v[2]))

$result["char_class"] = ++$i;

}

}

return $result;

}

function opt_len($str, $length=0, $option){

if ($option == ">=") {

if (strlen($str) >= $length)

return true;

}

if ($option == "<=") {

if (strlen($str) <= $length)

return true;

}

if ($option == "

if (strlen($str) < $length)

return true;

}

if ($option == ">") {

if (strlen($str) > $length)

return true;

}

if ($option == "==") {

if (strlen($str) == $length)

return true;

}

if ($option == "!=") {

if (strlen($str) != $length)

return true;

}

return false;

}

function opt_match($str, $substr, $option){

if ($option == "exclude") {

//strpos() is faster than preg_match()

return !(strpos($str, $substr) !== false);

//return !preg_match("/$substr/", $str);

}

if ($option == "include") {

return (strpos($str, $substr) !== false);

//return preg_match("/$substr/", $str);

}

if ($option == "equals") {

return ($str == $substr);

//return preg_match("/^$substr$/", $str);

}

if ($option == "noequals") {

return ($str != $substr);

//return !preg_match("/^$substr$/", $str);

}

return false;

}

function opt_char_class($str, $reg, $option){

if ($option == "exclude") {

return !preg_match("/$reg/", $str);

}

if ($option == "include") {

return preg_match("/$reg/", $str);

}

return false;

}

}; p

ass_check.php密码检测类文件,此文件接受规则,生成策略,执行检测,最后返回结果

class pass_intensity_check

{

private $intensity_policy;

private $check_result;

private $stand;

function pass_intensity_check($rules, $stand){

$this -> intensity_policy = new pass_intensity_policy($rules);

$this -> stand = $stand;

}

function do_check($pass, $user){

$this -> check_result = $this -> intensity_policy -> check($pass, $user);

}

function get_level(){

//print_r($this -> check_result);

//decide pass level from 'STRONG' to 'UNVALID'

if (strpos($this -> check_result["len"], $this -> stand[STRONG]["len"])!==false

&& $this -> check_result["match"]==$this -> stand[STRONG]["match"]

&& $this -> check_result["char_class"]>=$this -> stand[STRONG]["char_class"]) {

return STRONG;

}

if ((strpos($this -> check_result["len"], $this -> stand[MIDDLE]["len"])!==false

|| strpos($this -> check_result["len"], $this -> stand[MIDDLE]["len"])!==false)

&& $this -> check_result["match"]==$this -> stand[MIDDLE]["match"]

&& $this -> check_result["char_class"]>=$this -> stand[MIDDLE]["char_class"]) {

return MIDDLE;

}

if (strpos($this -> check_result["len"], $this -> stand[WEAK]["len"])!==false

|| strpos($this -> check_result["len"], $this -> stand[WEAK]["len"])!==false) {

return WEAK;

}

return UNVALID;

}

};

编写此程序的基础是需要了解常规的正则表达式匹配,同时按照面向对象的方法组织,使程序更具扩展性。第一次写文章,不清楚的地方敬请原谅哈

0818b9ca8b590ca3270a3433284dd417.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值