2017-03-07 1 views
-4

Ich versuche zu verstehen, was mit meinem Code falsch gelaufen ist. Es ist ein Login-Prozess zu cp. Sie erhalten das richtige Ergebnis, wenn Sie den richtigen Benutzernamen eingeben (nur Benutzername noch, nur für diesen Test). aber du bekommst nichts, wenn du es nicht tust - nichts, wofür ich es programmiert habe.Es passiert nichts beim Eingeben eines falschen Benutzernamens. Was ist falsch in meinem Code?

Ich binwirklich verzweifelt, versuchte dies die ganze Nacht zu lösen. Bitte hilf mir. hier ist der Code.

Berechnungen:

if (isset ($ _ POST [ 'connection_made'])) {// eine Verbindung hergestellt worden ist? einen versteckten Eingang mit

$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'); 
     } 
} 

}

Form:

 <?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> 

mir bitte helfen. Danke.

Antwort

0

Zunächst sind Sie offen für SQL injection. Sie müssen vorbereitete Anweisungen verwenden, anstatt Variablen in Ihre Abfrage zu verketten. Siehe How can I prevent SQL injection in PHP?.

Zweitens schlägt Ihr Code fehl, weil Sie nie in die while Schleife gelangen, wenn der Benutzername ungültig ist. Das heißt, wenn Sie einen falschen Benutzernamen eingeben, wird diese Bedingung nie erfüllt:

while ($admin_row = mysqli_fetch_array($cp_validate_login)) 

So, Ihr if/else Logik wird nie ausgeführt.

Die Lösung hier ist nicht zu versuchen, Ihren vorhandenen Code zu verbessern. Sie müssen damit aufhören und eine vorhandene Authentifizierungsbibliothek (Login-Bibliothek) verwenden. Sicherheit ist hart, und die ordnungsgemäße Authentifizierung und Autorisierung ist keine Ausnahme. Sie sollten Ihren eigenen Sicherheitscode nicht rollen.

+0

Erstens, vielen Dank. 1 - Ich bin froh, dass Sie mich über diese gefährlichen Vars in der Abfrage gewarnt haben. Problem ist mit der Verbindung, die du mir gabst - ich kann es nicht verstehen, weil es Beispiele sind, die von OOP geschrieben werden - etwas, das ich nicht verstehe oder verwende. Kannst du mir bitte etwas anderes geben? Auch, danke für die Lösung. sollte es selbst herausgefunden haben (wahrscheinlich 24 Stunden wach zu bleiben ist nicht die beste Idee). Über die Verwendung von Somere Code - das ist eine Sache, die ich nie tun möchte. und noch einmal, Mangel an OOP-Wissen verhindert, dass ich damit arbeiten kann. Kann ich meinen aktuellen Code einfach "aufbessern"? –

+0

durch die Art und Weise, ist dies, wie ich gefiltert alle: Funktion forms_filter ($ form_value) { \t Rückkehr strip (htmlspecialchars (strip_tags ($ form_value))); } –

+0

@OriR Ihre 'forms_filter()' Funktion ist nicht annähernd genug, um es sicher zu machen; Die einzige sichere Option sind vorbereitete Anweisungen mit Parametern. Wenn jemand einen Nutzernamen wie "ODER 1 = 1 -" einreicht, wird er dem Administrator Zugriff gewähren. Wie für die Verwendung von jemand anderen Code: das ist absolut * ist * was Sie tun sollten, * vor allem * mit Authentifizierung, aber * nur * sobald Sie verstehen, was der Code tut.Ich habe so gedacht wie du, aber das ist sehr gefährlich. Wenn Sie nur Ihren aktuellen Code "auffüllen", werden Sie unvermeidlich andere, große Löcher verpassen. Verwenden Sie einen Rahmen, damit Sie das Rad nicht neu erfinden müssen. –