2016-04-26 16 views
-2

私は次のコードを持っていますが、データベースにパスワードが格納されている35のアカウントにログインすることはできません。私はvar_dumpパスワード変数は、その変数に挿入されているものと、データベースに格納されているパスワードと同じ値を表示します。すべてのヘルプ、はmd5 phpでアカウントにログインできません

<?php 
    include_once("config.php"); 
    session_start(); 
    $message = ""; 

    if (isset($_POST['username'])) {  
     $username = ($_POST['username']); 
     $password =md5($_POST['password']); 
     $password = ($password); 

     $sql = "SELECT * FROM user WHERE username = '$username' && password='$password'"; 
     $query = mysqli_query($conn, $sql); 
     $row = mysqli_fetch_row($query); 
     $userid = $row[0]; 
     $checkuser = $row[5]; 
     $checkpassword = $row[4]; 
     $type = $row[1]; 
     $name = $row[2]; 
     $surname = $row[3]; 

     if ($username != $checkuser || $password != $checkpassword) { 
      $message = " username or password entered is incorrect."; 
     } 

     if ($username == $checkuser && $password == $checkpassword) { 
      $_SESSION['username'] = $username; 
      $_SESSION['type'] =$type; 
      $_SESSION['name'] = $name; 
      $_SESSION['surname'] = $surname; 
      $_SESSION['userid'] = $userid; 

      if($_SESSION['type'] == "admin") { 
       header("Location: adminindex.php"); 
      } else { 
       header("Location: index.php"); 
      } 

     } 
    } 
?> 
+1

は、なぜあなたは値を比較しているので、何回?どの比較が失敗したのでしょうか? – David

+3

パスワードのセキュリティを処理するには、PHPの[組み込み関数](http://jayblanchard.net/proper_password_hashing_with_PHP.html)を使用してください。 5.5より小さいPHPバージョンを使用している場合、 'password_hash()' [互換パック](https://github.com/ircmaxell/password_compat)を使用することができます。ハッシュする前に[パスワードを逃さないでください](http://stackoverflow.com/q/36628418/1011527)、または他のクレンジングメカニズムを使用していることを確認してください。パスワードを変更すると、パスワードが変更され、不要な追加のコーディングが発生します。 –

+1

[Little Bobby](http://bobby-tables.com/)は、[あなたのスクリプトはSQLインジェクション攻撃の危険にさらされていると言います。](http://stackoverflow.com/questions/60174/how-can-i-prevent -sql-injection-in-php)[MySQLi](http://php.net/manual/en/mysqli.quickstart)の[prepared](http://en.wikipedia.org/wiki/Prepared_statement)のステートメントについて学んでください。 .prepared-statements.php)。 [文字列をエスケープする](http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string)でも安全ではありません! –

答えて

1

それを感謝をしたり、プリペアドステートメントを使用していないが、あなたは間違いなく、SQLインジェクションに開いた自分を残しているという事実に問題があってもなくてもよいです。

プリペアドステートメントの例:

$stmt = $conn->prepare("SELECT * FROM user WHERE username =? AND password=?"); 
$stmt->bind_param("ss", $username, $password); 
$stmt->execute(); 

参照:http://php.net/manual/en/mysqli.prepare.php

+1

[これに従わない](http://dev.mysql.com/doc/refman/5.7/en/logical-operators.html)。 –

+0

クールネス....... –

+1

これで、あなたのコードはOPには答えられません。 –

関連する問題