2017-03-07 8 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?を参照してください。

第2に、ユーザー名が無効な場合は、ループをwhileループに入れないため、コードが失敗します。だから、

while ($admin_row = mysqli_fetch_array($cp_validate_login)) 

、あなたのif/elseロジックが実行されることはありません:あなたが偽のユーザ名を入力する場合には、この条件が満たさことはありません、です。

解決策は、既存のコードを改善するためにではなく、です。それはあなたがやっていることをやめ、既存の認証(ログイン)ライブラリを使用することです。セキュリティはであり、適切な認証と認可も例外ではありません。あなた自身のセキュリティコードをロールしてはいけません。

+0

まず、多くのおかげです。 1 - 問い合わせに危険なバールについて警告してくれてうれしいです。あなたが私に与えたリンクに問題があります - 私は理解できません。例はOOPによって書かれているからです。あなたは私に別の何かを与えてくれる? また、ソリューションに感謝します。 (おそらく目を覚ます24時間は最善のアイデアではない)自分自身を把握する必要があります。 somone else codeの使用について - これは私がしたくないことの1つです。もう一度、OOPの知識の欠如は、私がそれらと一緒に働くことを妨げる。 私の現在のコードをちょうど "パッチアップ"することはできますか?道による –

+0

が、これは私がすべてのフィルタ処理方法です: 関数forms_filter($ form_value) { \tリターンにstripslashes(はhtmlspecialchars(strip_tags($ form_valueを))); } –

+0

@OriRあなたの 'forms_filter()'関数はそれほど安全ではありません。唯一の安全なオプションはパラメータ付きの準備文です。誰かが '' OR 1 = 1 --'のようなユーザー名を送信すると、あなたのコードはその人に管理者アクセス権を与えます。他の誰かのコードを使うことについては、コードが何をしているのかを理解すれば、絶対に*あなたが何をすべきか、特に認証に関しては、*特に*です。私はあなたのやり方を考えていましたが、それは非常に危険です。あなたが現在のコードを単に "パッチアップ"すれば、必然的に他の大きな穴が欠けてしまうでしょう。フレームワークを使用して、ホイールを再開発する必要はありません。 –

関連する問題