1

我想创建一个功能,如果帐户上存在多次暴力尝试,它将提醒用户。如果字符串匹配超过 75%,该函数将提醒用户。我已经执行了这个:

function Password_Match ($String, $Stored_Password){
    $New_String = str_split($String);
    $New_Stored_Password = str_split($Stored_Password);
        $Match = 0;
    foreach ($New_String AS $Value){
        if (in_array($Value,$New_Stored_Password)){
            $Match++;
        }
    }
    return $Match;

}

$String = "Test";
$Pass = "Tesst";
echo Password_Match($String,$Pass);

这将返回 4,但我的代码中显然存在一个我无法找到解决方案的缺陷。协助将是辉煌的。

4

3 回答 3

6

你一开始就不应该这样做。

应该通过对失败的尝试施加每小时/每天的限制来简单地防止暴力攻击。用户关心黑客与猜测密码的距离有多近?

此外,更重要的是,您不应该首先以明文形式存储用户密码。这是一个比告诉用户破解尝试更严重的安全问题。

有关如何正确存储密码的深入讨论,请参阅这些问题:

于 2013-06-22T14:24:41.373 回答
1

您要做的是edit distance在两个字符串之间进行测量。PHP 有一个内置函数来完成此任务。

int levenshtein ( string $str1 , string $str2 )

总结答案

$x = levenshtein ($str1 ,$str2);

$ratio = $x / strlen($str1); //or 2 

if ($ratio > 0.75) { //case match } 
else { //case miss match}
于 2013-06-22T14:22:28.400 回答
0

密码应使用单向加密进行加密,不应以纯文本形式存储在数据库中。但是,如果您真的想以这种方式接近..尝试这样的事情:

function Password_Match ($String, $Stored_Password){
    similar_text($String,$Stored_Password,$Percentage);
    if ($Percentage > 75){
        return true;
    }
    return false;
}
于 2013-06-22T14:34:55.293 回答