2013-07-29 67 views
0

我試圖讓我的網站要求用戶(創建帳戶時)包含3/4密碼要求。我希望密碼包含的要求是:1.數字2.小寫字母3.大寫字母4.特殊符號/字符。這裏是我的代碼至今:3/4密碼要求

$passwordspecs='^(?=.{8, 20})(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$ | ^(?=.{8, 20})(?=.*[a-z])(?=.*[A-Z])(?=.*[@$#£&]).*$ | ^(?=.{8, 20})(?=.*\d)(?=.*[a-z])(?=.*[@$#£&]).*$ | ^(?=.{8, 20})(?=.*\d)(?=.*[A-Z])(?=.*[@$#^£&]).*$'; 
    if(preg_match('/$passwordspecs/', $_POST['password'])) { 
     $results="INSERT INTO Operator (Username, Password, PermissionLevel) 
     VALUES ('$_POST[username]', '$_POST[password]', '$_POST[plevel]')"; 
     echo "One user added!"; 
    } 
    else { 
     echo '<script type="text/javascript">'; 
     echo 'alert("Password needs to contain 3/4 requirements!")'; 
     echo '</script>'; 
    } 

我終於能擺脫被即將到來的錯誤消息,但現在,如果我進入3/4或4/4密碼的要求,無論它直接到else語句,我得到警報消息。任何關於什麼是錯誤的想法或者可能有更簡單的方法來做到這一點?

+3

(偏離主題)請不要這樣做。你只會激怒你的用戶。 – RichieHindle

+1

對單個需求使用單個正則表達式。把它們放在一個數組中,迭代它們並計數。 – Bergi

+2

''/ $ passwordspecs /''=>你需要雙引號'「/ $ passwordspecs /」',否則變量將不會被解析並在重要的旁註中被替換 – x4rf41

回答

5

你的問題是在這裏:

preg_match('/$passwordspecs/', $_POST['password']) 

您正試圖在一個單引號的變量$ passwordspecs訪問值。您需要使用雙引號。否則它被視爲一個字符串。將其更改爲:

preg_match("/{$passwordspecs}/", $_POST['password']) 

但你比更多的問題:

  1. 不要儲存密碼作爲一個字符串,使用某種散列算法作爲Garytje建議。
  2. 不要將數據直接插入到用戶提供的數據庫中。 (不要信任用戶輸入),換句話說就是使用準備好的語句,否則有人會注入SQL代碼。

在我看來,作爲一個客戶/用戶,我討厭當我不得不選擇一個這樣的密碼,以後很難記住它。我正在您的網站上註冊(意味着您獲得+1用戶)爲什麼我不能選擇密碼,無論我想要的「黑客」是什麼?爲什麼我必須遵守你的規則。也許我想讓我的密碼成爲一個空白的空間?

而且還告訴他們要輸入的那種格式的密碼的用戶,它給出了敏感信息,可能的「黑客」,因爲這樣他們可以縮小所有可能的密碼中使用蠻力來匹配您的格式和攻擊強迫

+0

謝謝你的安全信息,但幸運的是,我現在不用擔心。我試着將它改爲雙引號,但我仍然有相同的結果/問題 – Llama

+0

我同意你的密碼建議,但我只是創建我被告知要做的=/ – Llama

+0

試試這個:'「/ {$ passwordspecs } /「' – GGio