0

アクティベーション後にログインしようとすると、パスワードが一致しない理由がわかりません。見やすくするために、以下に貼り付けたコードを切り詰めました。

関連する登録コードは次のとおりです。

$salt = substr(sha1(uniqid(rand(),true)),0,20);
$password_db = hash('sha256', $salt.$password1);

$sqlinfo = mysql_query("INSERT INTO db_1 (email, password, salt)
VALUES('$email1','$password_db','$salt')") or die(mysql_error());

ログイン用の相関コードは次のとおりです。

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

$sqlinfo = mysql_query("SELECT * FROM db_1 WHERE email='$email' AND emailactiv='1'"); 

if($sqlinfo['password'] == hash('sha256', $sqlinfo['salt'].$password)){
    while($row = mysql_fetch_array($sqlinfo)){
    ... }
    else { ...

私はこれまで何度か繰り返しを行ってきましたが、役に立ちませんでした。任意の洞察をいただければ幸いです。

4

3 に答える 3

1

現在、コーディングはSQLインジェクションに対して脆弱です。1つの提案は、 PDOまたはMySQLIを使用してコードを再フォーマットすることです。

PDOの例:

<?php

$stmt = $dbh->prepare("SELECT * FROM db_1 WHERE email = ? AND emailactiv=? ");
$stmt->bindParam(1, $email);
$stmt->bindParam(2, 1);

$stmt->execute();

?>

行をフェッチしなかったため、何にも一致しません。IFステートメントの前に次の行を追加します。

$rowHere = mysql_fetch_row($sqlinfo);

$rowHereそしてあなたのIF声明で使用してください。

于 2012-08-06T23:00:45.040 に答える
0
$email = $_POST['email'];
$password = $_POST['password'];

$sqlinfo = mysql_query("SELECT * FROM db_1 WHERE email='$email' AND emailactiv='1'"); 

//You need to first fetch data before using it.
while($result = mysql_fetch_array($sqlinfo)) {

    //Now you can use the data
    if($result['password'] == hash('sha256', $result['salt'].$password)){
         //matched... login correct
    } else {
         //not matched.. invalid login
    }
}
...

それが自明であることを願っています。あなたは1つの非常に重要な行を逃しました!

ところで、mysql_ *関数は非推奨になっているので使用をやめ、PDOまたはmysqli_*を使用してください

編集:今すぐお試しください。1つの値しか保持できないと思いました(ログイン用)

于 2012-08-06T22:49:04.953 に答える
0

を使用する必要がありますmysqli_fetch_array

また、mysql_*関数は非推奨になりました。代わりにMySQLiまたはPDOを使用してください。

mysqli_real_escape_stringまた、またはPDOを使用して、SQLインジェクションを回避するために、「入力をサニタイズする」(一般的なフレーズ)必要があります。

質問へのコメントに従って、BobbyTablesのリンクを参照してください。

于 2012-08-06T23:14:48.750 に答える