web-dev-qa-db-ja.com

データベースのユーザー名とパスワードを確認します(スクリプトが含まれています)

私は質問を投稿しました こちら そして投稿を編集する前に、実際の質問ではなく閉じられました!

次のようなログインフォームがあります。

<html>
  <head>
    <title>Password Checking Script</title>
  </head>
  <body>
    <form action="check_user-pass.php" method="POST">
      <h3>Please Login</h3>

      User Name: <input type="text" name="user_name"><br>
      Password: <input type="password" name="password">

      <input type="submit" name="submit" value="Login!">
    </form>
  </body>
</html>

ご覧のとおり、このフォームはcheck_user-pass.phpを介してユーザーを認証します。
データベースでこれらの資格情報を探します。存在する場合はOKを返し、そうでない場合は値NOを返します。

だから私の質問は:正確にどのコードをcheck_user-pass.phpに含めるべきですか?
コードを追加しようとしましたが、それもできませんでした!私の現在のコードは:

<?php
ob_start();
$Host=""; // Host name 
$username=""; // Mysql username 
$password=""; // Mysql password 
$db_name=""; // Database name 
$tbl_name=""; // Table name

// Connect to server and select databse.
mysql_connect("$Host", "$username", "$password") or die(mysql_error());
echo "Connected to MySQL<br />";
mysql_select_db("$db_name") or die(mysql_error());
echo "Connected to Database<br />";
// Check $username and $password 
/*
if(empty($_POST['username']))
{
    echo "UserName/Password is empty!";
    return false;
}
if(empty($_POST['password']))
{
    echo "Password is empty!";
    return false;
}
*/

// Define $username and $password 
$username=$_POST['username']; 
$password=md5($_POST['pass']);


// To protect MySQL injection (more detail about MySQL injection)
$username = stripslashes($username);
$password = stripslashes($password);
$username = mysql_real_escape_string($username);
$password = mysql_real_escape_string($password);

$sql="SELECT * FROM $tbl_name WHERE username='$username' and password='$password'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $username and $password, table row must be 1 row
if ($count==1) {
    echo "Success! $count";
} else {
    echo "Unsuccessful! $count";
}

ob_end_flush();
?>
8
Pds Ir

フォームの名前はuser_nameしかし、スクリプトでusernameを探します

$username=$_POST['username']; 

あるべき

$username=$_POST['user_name']; 

編集:
crypt を使用してパスワードを暗号化してからデータベースに入れる場合は、これを試してください

$sql="SELECT * FROM $tbl_name WHERE username='$username'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $username and $password, table row must be 1 row
if($count==1){
    $row = mysql_fetch_assoc($result);
    if (crypt($password, $row['password']) == $row['password']){
        session_register("username");
        session_register("password"); 
        echo "Login Successful";
        return true;
    }
    else {
        echo "Wrong Username or Password";
        return false;
    }
}
else{
    echo "Wrong Username or Password";
    return false;
}

編集:myBBはパスワードにmd5ハッシュのスクラップロードを使用しているようです、これを試してください

$sql="SELECT * FROM $tbl_name WHERE username='$username'";
$result=mysql_query($sql);

// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $username and $password, table row must be 1 row
if($count==1){
    $row = mysql_fetch_assoc($result);
    if (md5(md5($row['salt']).md5($password)) == $row['password']){
        session_register("username");
        session_register("password"); 
        echo "Login Successful";
        return true;
    }
    else {
        echo "Wrong Username or Password";
        return false;
    }
}
else{
    echo "Wrong Username or Password";
    return false;
}

また、ハッシュは1つの方法であるため、dbに既にあるパスワードを取り戻すことはできません。ユーザーにパスワードの変更/更新を行わせる必要があります。
上記が機能する場合、暗号化をオフにする必要はありません。すべて問題ありません。

3
Musa

ほとんどの場合、mysqlデータベースのパスワードは暗号化されます。データベースに直接入力した場合、それらには塩がない場合があります。クエリに渡す前にパスワードを暗号化してみてください。

$crypted_pass = crypt($password);

ソルト(多くの場合、ユーザー名の最初の2文字)がある場合は、crypt関数でそれを渡します。

$salt = substr($username, 0, 2);
$crypted_pass = crypt($password, $salt);
2
aynber

簡単なものを試してください:

    if ($count==1) {
        echo "Success! $count";
    } else {
        echo "Unsuccessful! $count";
    }

これにより、1つ以上の値を返すかどうかがわかります。

2
n_starnes