2017-01-28 3 views
1

PHPが「ログインできなくて残念です」というエラーが発生しています。私の条件の1つによれば、ログインが正しい場合でも、私のPreparedシステムがSQLインジェクションを避けることができなくても設定されます。Prepared文を作成してログインするときにエラーになるPHP

だから私のコードは次のようになります:

global $connected; 

$post = filter_var_array($_POST, FILTER_SANITIZE_STRING); 
$pwwd = $post['password']; 
$usrn = $post['username']; 
$usrn = mysqli_real_escape_string($connected, $usrn); 
$pwwd = mysqli_real_escape_string($connected, $pwwd); 

if (strlen($usrn) != 0 && strlen($pwwd) != 0 && !empty($post)) { 
    $usrn = stripslashes($usrn); 
    $pwwd = stripslashes($pwwd); 
    $hashFormat = '$2ysomenumber$'; 
    $salt = 'somehashobviously'; 
    $hashF_and_salt = $hashFormat.$salt; 
    $pwwd = crypt($pwwd, $hashF_and_salt); 

    if (!mysqli_connect_errno()) { 
     mysqli_select_db($connected, 'someDbname') or die('Database select error'); 
    } else { 
     die('Failed to connect to PHPMyAdmin').mysqli_connect_error(); 
    } 

    $query = "SELECT Username, Password FROM users WHERE Username=? AND  Password=?"; 

    $stmt = mysqli_stmt_init($connected); 

    if (mysqli_stmt_prepare($stmt, $query)) { 
     //Some error in here somewhere 

     mysqli_stmt_bind_param($stmt, "ss", $usrn, $pwwd); 
     mysqli_stmt_execute($stmt); 

     mysqli_stmt_fetch($stmt); 

     mysqli_stmt_bind_result($stmt, $check_usrn, $check_pwd); 

     if (strcasecmp($usrn, $check_usrn) == 0) { 
      if ($pwwd == $check_pwd) { 
       echo '<h1 class="text-center">Matches</h1>'; 
       print_r($row); 
      } 

     } else { 
      echo "<h1 class=text-center>We're sorry we can't log you  in.</h1>"; 
     } 

    } 

} else { //This is for strlen boolean cond 
    echo "<h1 class='text-center'>Both fields must not be empty. </h1>"; 
} 

私が働いていたプリペアドステートメントなしでログイン・ページを使用するために使用されるが、私は、私はより良いセキュリティのためにこれを行う必要があり実現。私のデータベースは正常に動作しているので、問題はどこにあるのですか? "//ここで何らかのエラーが発生しました"。

私は比較的新しいPHPプログラマーですが、まだ初年度の学生であり、休暇中に新しいことを試みています!オープンな私はすべての助けを読むだろう、ありがとう!

+0

に警告セクションを参照してください;'、あなたはあなたのコードに問題が表示されます。 – Ibu

+0

My $ check_usrnと$ check_passは、私が行ったことから間違いなくNULL値です。今はどうすればNULL値ではなく、データベースでチェックされる値であるように修正するのですか? –

答えて

0

まず、このようなデータベースへの接続コードが表示されませんでした。 $connected = msqli_connect(host,user,password,db_name) ;mysqli_select_db()機能を呼び出す必要はありません。

第二に、あなたは最後mysqli_connect()関数には、エラーコードの値ならば整数として0を返すmysqli_connect_errno()機能(ブール値ではない)から、あなたのconnectinonをチェックしています。

3番目にprepare文を初期化する必要はありません。

第4はmysqli_stmt_bind_reslut()mysqli_stmt_fetch()の前になります。注釈ポイントを参照してくださいmanual

===の代わりにパスワードに一致するように機能を使用してhash_equals()。 `のvar_dump($ usrn、$ check_usrn)を行うcrypt

$connected = msqli_connect(host,user,password,db_name) ; 
if(!$connected) 
{ 
    die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error()); 
} 
    echo "Your connection is successful . " 
if($stmt = mysqli_prepare($connected,$query)) 
{ 
     mysqli_stmt_bind_param($stmt, "ss", $usrn, $pwwd); 
     mysqli_stmt_execute($stmt); 
     mysqli_stmt_bind_result($stmt, $check_usrn, $check_pwd); 
     mysqli_stmt_fetch($stmt); 
     /* Now do Your Work */ 

} else 
    { 
     /* still prepare statement doesn't work */ 
    } ` 
+0

私は接続に問題はないと言いますが、別のページにリンクしています。これはあなたが見たいコードの一部です。しかし、私は不要なコードを削除します。ご連絡ありがとうございます。 –

+0

答えが – gaurav

+0

の新しいアップデートをご覧くださいありがとうございました!私はちょうど私の行の2つが混在していることを知った!私はまた、より良いセキュリティのためにパスワードをチェックする機能を変更しました。もし私が評判を持っていたら;私は間違いなくあなたのコメントを+1するでしょう。あなたは私に多くの時間を救った!編集:プリペアドステートメントとPDOステートメントの比較私は十分なセキュリティを持っていると思いますか?あなたは私のデータベースに害を及ぼさないSQLインジェクションを私に試すことができますか? –

関連する問題