0

以下は、フォームの[パスワードの変更]ボタンをクリックしたときに実行されるスクリプトです。フォームには、新しいパスワード用と新しいパスワードの確認用の2つのパスワードフィールドが含まれています。フォームのアクションスクリプトは次のとおりです。

<?php
session_start();

include("func.php");

$NewPassword = mysql_real_escape_string(md5($_POST['newpassword']));
$Confirm = mysql_real_escape_string(md5($_POST['confirmnewpassword']));
$userid = $_SESSION['username'];

if (!isset($NewPassword) || !isset($Confirm)) {
    header("Location: ../error.php");
    die("Error");
}else if ($NewPassword <> $Confirm) {
    header("Location: ../error.php");
    die("Error");
}else{
    dbConnect();

    mysql_query("UPDATE users SET password='$Confirm' WHERE username='$userid'");

    mysql_close($connect);

    header("Location: ../profile.php");
    die("Success");
}
?>

フォームの2つのパスワードフィールドが空であるか一致しない場合でも、パスワードはデータベースで更新されます。これが可能である理由は何ですか?

私は提供された助けに感謝します。

4

3 に答える 3

1

md5 は 16 進数を返すため、md5 関数を mysql_real_escape_string で囲む必要はありません。

 if (!isset($NewPassword) || !isset($Confirm)) {

$_POST['newpassword'] と $_POST['confirmnewpassword'] が空でないかどうかを確認する必要があります。この場合、パスワードが両方とも空の場合、パスワードが更新されます。

パスワードが異なっていてもパスワードが更新されることについて、GET ではなく POST を使用して変数を渡し、パラメーターの名前が「newpassword」と「confirmnewpassword」であることを 100% 確信していますか?

変数の値を表示する「エコー」を配置して、パラメーターが正しく渡されていることを確認してください。99% 問題があります。

于 2012-11-03T18:51:27.060 に答える
1

空の文字列がハッシュされてアップロードされるのを防ぐコードは何もありません。元の文字列ではなく、ハッシュをチェックしています。これは、空の値がまだ更新される理由を説明します。

ただし、値が一致しない場合、それらのハッシュは異なるはずです。これは、変数$_POST['newpassword']である可能性が高く、$_POST['confirmnewpassword']正確ではないことを示しています。他の人が示唆しているように、コードの先頭にあるvar_dumpまたはprint_r($_POST)ステートメントでさえ、これを診断するのに役立ちます。

PDO と mysql のような大局的な問題に踏み込んだり、コードを別の方法で構造化したりすることさえせずに、私なら次のようにします。

session_start();
include("func.php");

print_r ($_POST); // you'll want to delete this later 

$new_password = $_POST['newpassword']; // not technically necessary, my preferred style
$confirm_password = $_POST['confirmnewpassword']; // also not technically necessary
$userid = $_SESSION['username'];


/* Test the actual submitted password and confirmation to ensure they are set */
if (empty ($new_password) || empty ($confirm_password)) {
    /* header("Location: ../error.php"); */ // comment this out for now
    die ("Error: Password or Password Confirmation not set");
}

/* Test the actual submitted password and confirmation to ensure they match */
elseif ($new_password != $confirm_password) {
    /* header("Location: ../error.php"); */ // comment this out for now
    die("Error: Password and Password Confirmation do not match");
}

else {
    /* NOW that you have established the password and confirmation are both
     * set AND match, you get the hash value */
    $password_hash = mysql_real_escape_string(md5($new_password));
    dbConnect(); 
    mysql_query("UPDATE users SET password='$Confirm' WHERE username='$userid'");
    mysql_close($connect);
    /* header("Location: ../profile.php"); */ // comment this out for now
    die("Success: Updated");
}

これにより、スクリプトをデバッグして、何が問題なのかを確認できます。私の推測では、データが GET として渡されているか、変数名が正しくありません。

次のステップ:

  1. 動作したら、var_dump を削除し、リダイレクトのコメントを外します。
  2. 他の回答の1つに記載されているように、パスワードが正しいことをより明示的にテストするためにifステートメントを作り直すことを検討してください。
  3. 真剣に、PDOまたはmysqliを調べてください。手続き型の mysql_* は廃止される予定です。
  4. 完全な OOP ルートに行きたくない場合は、 update_password () や send_error () などの関数を作成することを検討してください。これにより、コードがより読みやすく、再利用しやすくなります。

しかし、一度に 1 ステップずつ、この最新のものをデバッグしましょう!

于 2012-11-03T20:12:17.500 に答える
0

これが機能しない特定の理由を見つけることはできません (デバッガーまたはデバッグ メッセージを使用してみてください)。新しいパスワードとその確認が一致し、パスワード ポリシーに対して検証されていることが 100% 確実な場合にのみ、パスワードを更新してください。少なくとも、空の文字列ではないことを確認してください。

于 2012-11-03T18:55:26.820 に答える