パスワードはPHPログインシステムでは動作しません

私はパスワードをハッシュ化して塩漬けしたWebサーバー上にPHPメンバーエリアを設定しようとしています。私はアカウントを登録し、データベースをチェックしました - ユーザーは期待どおりに作成されました - すべてうまく見えました。問題は、ログインしようとするたびに、ログインが間違っているということです(ユーザー名またはパスワード)。もちろんこれはテストエリアで行われており、登録したユーザー名とパスワードは機能するはずですが、そうではありません。

auth.php: should authenticate the user and create a session if the details are valid //login never works

<?php
session_start();

$username = $_POST['username'];
$password = $_POST['password'];

if (strlen($username)<3 || strlen($password)<3) {
    header('Location: log_in.php5?error=1');
    die();
}

$username = mysql_real_escape_string($username);

function validateUser() {
    session_regenerate_id ();
    $_SESSION['valid'] = 1;
    $_SESSION['userid'] = $username;
}

include "../db_login.php5";
mysql_select_db("DB_NAME", $con);

$query = "SELECT password, salt
        FROM users
        WHERE username = '" . $username . "';";

$result = mysql_query($query);

$userData = mysql_fetch_assoc($result);
$count = mysql_num_rows($userData);

if ($count < 1) {
    header('Location: log_in.php5?error=1');
    die();
}

$salt = "";
$hashed_pass = "";

for ($x=0; $x<1; $x++) {
  $salt = $userData['salt'];
  $hashed_pass = $userData['password'];
}

$hash = hash('sha256', $salt . hash('sha256', $password));

mysql_close($con);

if ($hash != $hashed_pass) {
    header('Location: log_in.php5?error=1');
    die();
} else {
    validateUser();
}

header('Location: members.php5');
?>

register.php: should take the username, hash the password with a salt, store all 3 to DB //works

<?php
//retrieve our data from POST
$username = $_POST['username'];
$pass1 = $_POST['pass1'];
$pass2 = $_POST['pass2'];
if($pass1 != $pass2)
    header('Location: sign_up.php5');
if(strlen($username) > 30)
    header('Location: sign_up.php5');

$hash = hash('sha256', $pass1);

function createSalt(){
    $string = md5(uniqid(rand(), true));
    return substr($string, 0, 3);
}

$salt = createSalt();
$hash = hash('sha256', $salt . $hash);

include "../db_register.php5";
mysql_select_db("DB_NAME", $con);

//sanitize username
$username = mysql_real_escape_string($username);
$query = "INSERT INTO users (username, password, salt)
        VALUES ( '$username' , '$hash' , '$salt' );";
mysql_query($query);
mysql_close($con);

header('Location: log_in.php5');
?>

login.php ファイルは、auth.phpにデータを投稿する簡単な形式です。 sign_up.php ファイルはユーザーデータをregister.phpに投稿する簡単な形式です。

ログインできないようなコードで何が問題になっていますか?

編集:

だから私は問題を絞り込んだので、最初から空白に見える$ username変数がありますか?

出力:

Count: 
User: 
Query: SELECT * FROM `users` WHERE `username`='';

code for 出力:

$query = "SELECT * 
FROM `users` 
WHERE `username`='".$username."';";

$result = mysql_query($query);

$userData = mysql_fetch_assoc($result);
$count = mysql_num_rows($userData);

if ($count < 1) {
    echo "Count: ".$count."
" . "User: " .$username ."
" . "Query: " .$query; //header('Location: log_in.php5?error=1,count='.$count.'user='.$username); //die(); }

$ countと$ usernameは、AddressクエリとSQLクエリのどちらにも出力されません

編集2:

*Jared* eventually found the problems which were two in number:
1) $username = mysql_real_escape_string($username); <-- required a db connection $con in my case
2) $count = mysql_num_rows($userData); <-- required to pass the $result instead.

みんな、ありがとう!

0
ええ、あなたはすでにそれをやっているようですね? (=一重引用符を追加する、つまり)
追加された 著者 Pekka 웃,
通常、デバッグを使用してこのような問題を解決します。すべての変数と状態を段階的に出力して、問題が起こる正確な場所を特定できるようになるまで
追加された 著者 Pekka 웃,
$ username = $ _POST ['username']; $ユーザ名= mysql_real_escape_string($ username);
追加された 著者 Ozzy,
それでおしまい!!今働いている。笑。本当にありがとう!他の人にも感謝します:)。
追加された 著者 Ozzy,
ああ、あなたは正しいです、そして今は、空白でないユーザー名、実際には正しいユーザー名を持ってきます、ありがとう!奇妙なことに、$ countはまだ空白ですか?私もリンクが必要だと思います..編集:いいえ$カウントはまだ空です... :(
追加された 著者 Ozzy,
私のコードを精査していただきありがとうございます。誰も私の現在の問題を見ていますか? validateUser()が呼び出される前にスクリプトが終了しています(パラメータを渡すように更新しました)if($ count <1)で終了します。 @は、EDITの前に投稿しました:その$ _POSTから
追加された 著者 Ozzy,
ジャレド、詳細を教えてください。一番上に$ usernameが定義されています...なぜこの関数の範囲にはないはずですか?
追加された 著者 Ozzy,
それはうまくいかなかった...私のポストの新しい編集を見てください!
追加された 著者 Ozzy,
さて、私はそれを行い、$ countが1に近づいていることを知ったので、スクリプトがそこで死にそうになっていた...今、私はusernameがそれを周りに単一引用符で囲む必要があることを認識しました。私は今それを行うつもりです...
追加された 著者 Ozzy,
私の編集を参照してください。
追加された 著者 Shomz,
合意しましたが、グローバルではなく関数のパラメータを使用する方が良いでしょう。
追加された 著者 Shomz,
これはdbからデータをすでに抽出しているので、 $ count = count($ userData); を使用することができます。
追加された 著者 Shomz,
これは実際Jaredの解決策ですが、回答を投稿していないので、私は彼のコメントをすべて引用しました。
追加された 著者 Shomz,
これは私の意見ですが、 validateUser()はその関数の名前ではありません。実際に何らかのバリデーションが行われていることを示しています。 )。代わりに、実際には function setUserSession($ username){} です。少なくとも私の謙虚な意見では。
追加された 著者 Jared Farrish,
@ user1031312 - あなたのクエリの完全なスクリプトは動作しません。そのスクリプトから $ username はどこにありますか? $ username の代わりに $ _ SESSION ['username'] を使用したのかどうか疑問に思っています。
追加された 著者 Jared Farrish,
この例を参照してください: codepad.org/e6XXrMER 変数の範囲現在の validateUser()には関数スコープ内に $ username しかないので、関数内で 定義するか、 (引数、グローバルキーワード)。
追加された 著者 Jared Farrish,
mysql_real_escape_string($ username); には有効な mysql_connect()リンク識別子が利用可能です。その行ののデータベース接続部分を移動するとどうなりますか?または、その行を接続スクリプト/関数呼び出しの下に移動しますか?エラーの場合、 '(空)として文字列に出力される FALSE を返します。
追加された 著者 Jared Farrish,
mysql_query()の戻り値を mysql_fetch_assoc()の戻り値ではなく、"> mysql_num_rows() を参照してください。したがって、 $ count = mysql_num_rows($ result); です。
追加された 著者 Jared Farrish,
問題なく、私は助けることができてうれしい。 :)
追加された 著者 Jared Farrish,
validateUser()では、 $ username はそのスコープでは使用できません。その関数の最初の行に global $ username; が必要です。または、それを function validateUser($ username){} に渡す必要があります。
追加された 著者 Jared Farrish,

1 答え

この部分には何がありますか?

for ($x=0; $x<1; $x++) {
  $salt = $userData['salt'];
  $hashed_pass = $userData['password'];
}

$ userData のvar_dumpを実行します。

EDIT

function validateUser($username) {
    session_regenerate_id ();
    $_SESSION['valid'] = 1;
    $_SESSION['userid'] = $username;
}

そして底の近くに:

if ($hash != $hashed_pass) {
    header('Location: log_in.php5?error=1');
    die();
} else {
    validateUser($username);
}
2
追加された
ありがとう、あなたはおそらく私がこれを解決した後に私が持っていただろう大きな混乱を救った - しかし、それを出力しようとすると、$ usernameが空であるという問題は依然として残っています。
追加された 著者 Ozzy,
私はループを理解し、私は一度ループしていることを知っています。私はPHPでどのようにインデックスなしで同じ変数で多くのSQL結果をループすることができ、どのようにすべての結果を表示するか理解していません。 10人のユーザーがいる場合、$ userData ['salt'] varはすべて10になりますが、それは別の質問です。
追加された 著者 Ozzy,
私はPHPを初めて使いました。これは以前mysql_queryから結果を抽出することを以前知っていた唯一の方法です! $ countは1であるはずなので、$ countの代わりに1を入れます。 var_dumpの例を教えてください
追加された 著者 Ozzy,
しかし、ループ内で $ x 変数を使用していないので、ループは1回だけなので、 for の部分はここでは不要です。例: var_dump($ userData);
追加された 著者 Shomz,
この短いチュートリアルをご覧ください: tizag.com/mysqlTutorial/mysqlselect.php 本当にそうすべきです役に立った
追加された 著者 Shomz,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com