2017-03-07 66 views
-4

我想了解我的代碼出了什麼問題。這是一個登錄進程cp。在編寫正確的用戶名(只有用戶名,僅用於該測試)時,您會得到正確的結果。但是當你不這樣做時,你什麼也得不到 - 我沒有編程它。輸入錯誤的用戶名時沒有任何反應。我的代碼有什麼問題?

我是真的很絕望,試圖解決這整個晚上。請幫幫我。 這是代碼。

算了一筆賬:

如果(isset($ _ POST [ 'CONNECTION_MADE'])){//是已經取得了聯繫?使用隱藏的輸入

$form_user = forms_filter($_POST['form_user']); // filter any tags or any unwanted actions first 
$form_pass = forms_filter($_POST['form_pass']); // filter any tags or any unwanted actions first 

if (strlen($form_user) > 5 AND strlen($form_user) < 16 AND strlen($form_pass) > 5 AND strlen($form_pass) < 16) { 
     if (login_blank_filter($form_user, $form_pass) == true) { // are those values length shorter than the minimal value or longer? 

      $user_name = $form_user; 
      $raw_password = $form_pass; 
      $user_pass = password_hash($raw_password, PASSWORD_DEFAULT); // generating a hashed and salted password 

       $cp_validate_login = mysqli_query($data_connection, "SELECT * FROM `admins` WHERE `username` = '$user_name' "); 
       if (!$cp_validate_login) { die('error: ' . mysql_error()); } 

       while ($admin_row = mysqli_fetch_array($cp_validate_login)) { 

        if (mysqli_num_rows($cp_validate_login) == 1) { 
         echo "you made it."; 
         echo mysqli_num_rows($cp_validate_login); 
        } 
        else { 
         echo "not yet there."; 
         echo mysqli_num_rows($cp_validate_login); 
        } 

       } 
     } 
     else { 
      header('Location: index.php?login_status=2'); 
     } 
} 

}

表:

 <?php 
    if (isset($_GET['login_status'])) { 
     switch ($_GET['login_status']) { 

      case 1: 
      echo "wrong username or password"; 
      break;  

      case 2: 
      echo "the inputs has to be filled"; 
      break; 

      case 3: 
      echo "username\passwords are too short or too long"; 
      break; 

      default: 
      echo "unknown error"; 
     } 
    } 
    else { 
     echo "welcome. log in to the control panel please"; 
    } 
    ?> 
    </div> 

    <form name="loginform" method="post" action="index.php" onSubmit="return validateBlank()"> 
    <input type="hidden" name="connection_made" value=""> 

    <div class="login_layout"> 

     <div class="login_right_layout"> 
     user: 
     </div> 

     <div class="login_left_layout"> 
     <input class="login_input" name="form_user" type="text"> 
     </div> 

     <div class="login_right_layout"> 
     password: 
     </div> 

     <div class="login_left_layout"> 
     <input class="login_input" name="form_pass" type="password"> 
     </div> 

    </div> 

    <input type="submit" value="כניסה" class="login_submit"> 
    </form> 


</center> 

請幫助我。謝謝。

回答

0

首先,你是大開SQL injection。您需要使用準備好的語句,而不是將變量連接到查詢中。見How can I prevent SQL injection in PHP?

其次,你的代碼沒有因爲你永遠不讓它進入while循環,如果該用戶名無效。也就是說,如果你輸入一個假的用戶名,這種情況從來沒有滿足:

while ($admin_row = mysqli_fetch_array($cp_validate_login)) 

所以,永遠不會執行你的if/else邏輯。這裏

的解決方案是試圖改善現有的代碼。這是停止你在做什麼,並使用現有的認證(登錄)庫。安全性爲,正確的認證和授權也不例外。你不應該推出自己的安全代碼。

+0

首先,非常感謝。 1 - 我很高興你提醒我關於查詢中那些危險的變數。問題在於你給我的鏈接 - 我無法理解它,因爲它的例子是由OOP編寫的 - 我不明白也不使用。你可以給我一些其他的東西嗎? 另外,感謝您的解決方案。應該有自己的想法(可能保持清醒24小時不是最好的主意)。 關於使用somone else代碼 - 這是我從來不想做的一件事。再次,缺乏面向對象的知識阻止我與這些人一起工作。 我可以「修補」我目前的代碼嗎? –

+0

順便說一下,我這是怎麼過濾所有: 功能forms_filter($ form_value) { \t回報的stripslashes(用htmlspecialchars(用strip_tags($ form_value))); } –

+0

@OriR您的'forms_filter()'函數不足以保證安全;唯一安全的選擇是準備帶有參數的語句。如果有人提交了像'OR 1 = 1 - -'這樣的用戶名,你的代碼會給這個人管理員權限。至於使用別人的代碼:絕對*是*你應該做什麼,*特別是*有認證,但是*只有*一旦你明白了代碼的作用。我曾經認爲你的方式,但這是非常危險的。如果你只是「修補」你當前的代碼,你將不可避免地錯過其他主要的漏洞。使用一個框架,所以你不必重新發明輪子。 –