2017-01-14 6 views
-1

私を助けてくれますか?問題は毎回(正しいユーザー名とパスワードの組み合わせを入力すると)、「Failed 2」というエラーメッセージが表示されることです。私のmysqlログインコードで何が問題になっていますか?

<?php 
    if (isset($_POST["login-submit"])) { 
    if(!empty($_POST["username"]) && !empty($_POST["password"])) { 
     $username = $_POST["username"]; 
     $password = $_POST["password"]; 
     $username = mysql_set_charset($username); 
     $password = mysql_set_charset($password); 
     $username = stripcslashes($username); 
     $password = stripcslashes($password); 
     $username = mysql_real_escape_string($username); 
     $password = mysql_real_escape_string($password); 
     $result = mysql_query("select * from user where username = '$username' and password = '$password'"); 
     $row = mysql_fetch_array($result); 
     if($row["username"] == $username && $row["password"] == $password) { 
     //header("Location: index.php"); 
     echo "<p>Login</p>"; 
     } else { 
     echo "<p>Failed 2</p>"; 
     } 
    } else { 
     echo "<p>Failed 1</p>"; 
    } 
    } 
?> 
+0

mysql_queryを実行する前に '$ username'と' $ password'をエコーし​​ましたか?あなたの問題は 'mysql_set_charset'呼び出しにあります。その[documentation](http://php.net/manual/en/function.mysql-set-charset.php)を見てください。 'TRUE'または' FALSE'を返すだけです。これは、接続の文字セットを設定するために使用されます。 – Hicaro

+0

最大の間違いはパスワードをハッシュしていないことです! *ハッシュされていないパスワードを保存するたびに、rootが/ dev/nullに子猫を移動させます。 - 'password_hash()'と 'password_verify()'を使います。また、廃止された古いmysql関数を使用しています。PHP7 **で**を削除した場合は、代わりにmysqliまたはPDOを使用してください。また、パラメータ化されたステートメントを使用する - スラッシュをスティッシュすると** SQL注入から完全に保護されない** –

+0

ハッシュ関数を使用するだけでは不十分で、単に塩を追加するだけでセキュリティを向上させることはほとんどありません。代わりに、約100msの持続時間の間、ランダムな塩でHMACを繰り返し、塩をハッシュで保存してください。 'PBKDF2'(別名' Rfc2898DeriveBytes')、 'password_hash' /' password_verify'、 'Bcrypt'などの関数を使用してください。要点は、攻撃者が無差別にパスワードを見つけるのに多くの時間を費やすことです。ユーザーを保護することが重要です。安全なパスワード方法を使用してください。 – zaph

答えて

0

ありがとう:

次に、あなたがこのような何かを書くことができます。特にmysql_set_charsetが原因で問題が発生し、mysqliに変更されました。今すぐコードが動作します。ここにあります:

<?php 
    if (isset($_POST["login-submit"])) { 
    if(!empty($_POST["username"]) && !empty($_POST["password"])) { 
     $username = $_POST["username"]; 
     $password = $_POST["password"]; 
     $username = stripcslashes($username); 
     $password = stripcslashes($password); 
     $username = mysqli_real_escape_string($db, $username); 
     $password = mysqli_real_escape_string($db, $password); 
     $login = "select * from user where username = '$username' and password = '$password'"; 
     $result = mysqli_query($db, $login); 
     $count = mysqli_num_rows($result); 
     if ($count == 1) { 
     //header("Location: index.php"); 
     echo "<p>Login</p>"; 
     } else { 
     echo "<p>Failed 2</p>"; 
     } 
    } else { 
     echo "<p>Failed 1</p>"; 
    } 
    } 
?> 
0

可能性のある問題は次のようになります。

  • あなたは は、データベース内で暗号化されるかもしれないことをパスワードで($ _POSTから)平野パスワードを比較しています。この場合、保存されたパスワードと比較する前に、ご希望のパスワードを に暗号化してください。
  • 末尾のスペースでユーザー名またはパスワードを保存した可能性があります。このような場合は必ず比較

  • を行う前に、あなたのデータをトリム作ることは私がしたいのvar_dumpや印刷$行(も$ _POST)とあなたがより多くの情報

0

のためになっているか見てみてくださいパラメータ化されたSQLクエリを実行するにはPDO(PHP Data Objects)を使用することをお勧めします。 SQLインジェクションからあなたを守り、クエリを高速化します。あなたの役に立つ答えを $db = db($server, $user, $pass, $db); $sql = "select * from user where username =:username and password=:password"; $stmt = $db->prepare($sql); $stmt->bindParam("user", $yourPostUsername); $stmt->bindParam("pass", $yourPostPassword); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_OBJ); if ($result) { echo "<p>Login</p>"; } else { echo "<p>Failed 2</p>"; }

関連する問題