2013-06-22 78 views
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,但我的代碼中顯然存在一個缺陷,我找不出解決方案。分心會很棒。

+0

你說的是「字符串匹配」,好像有一個通用的定義。 – Jon

+0

[php相似的文本](http://php.net/manual/en/function.similar-text.php) – amigura

+0

該函數只是確定一個字符串的字符是否存在於另一個字符串中。然而,它並不關心位置,也不關心重複。所以'aaaaaa'和'abcdef'據說有6個匹配,因爲'aaaaaa'中的每個'a'出現在'abcdef'中。 – Gumbo

回答

6

你不應該擺在首位做這個答案。

蠻力攻擊應該簡單地通過對失敗嘗試施加每小時/每日限制來防止。用戶關心黑客猜測密碼的距離有多遠?

此外,更重要的是,你不應該在第一個明確的文本中存儲用戶的密碼。這是一個嚴重的安全問題,你可以告訴用戶關於破解企圖的問題。

看到這些問題的一些深層次的討論,就如何妥善保存密碼:

+1

-1爲評論作爲答案,但+1指出明顯的「你不應該存儲用戶的密碼以明文形式存儲」 – Popnoodles

+0

是的,我同意@popnoodles。我喜歡OP的評論「我的代碼中顯然存在缺陷」 – amigura

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} 
0

密碼應採用單向加密進行加密,他們不應該以純文本形式存儲在數據庫中。但如果你真的想要這樣的方式..試試這樣:

function Password_Match ($String, $Stored_Password){ 
    similar_text($String,$Stored_Password,$Percentage); 
    if ($Percentage > 75){ 
     return true; 
    } 
    return false; 
} 
相關問題