2017-07-30 10 views
-1

user_id = 3の場合やwhere文(WHERE user_id = "。$ user ['user_id']。)を削除したときに動作しますが、dbのすべてのパスワードが変更されます。パスワード確認のリセットが正しく機能していませんか?

私はすでにどのようにすべきで、そう= '$ユーザーID'/$ _GET [ 'user_idの'] user_idを試みること のuser_id = 3 & reset_token = XXXXXXXXX

<?php 

if(isset($_GET['user_id']) && isset($_GET['reset_token'])) { 
$userid = $_GET['user_id']; 
$reset_token = $_GET['reset_token']; 

// Make sure user email with matching hash exist 
$req = $heidisql->prepare("SELECT * FROM users WHERE user_id='$userid' AND reset_token='$reset_token' "); 

$req->execute($userid, $reset_token); 

$user = $req->fetch(PDO::FETCH_ASSOC); 


    if ($user) { 

     if (!preg_match ('%\A(?=[-_a-zA-Z0-9]*?[A-Z])(?=[-_a-zA-Z0-9]*?[a-z])(?=[-_a-zA-Z0-9]*?[0-9])\S{8,30}\z%', $_POST['new_pass']) 
     || $_POST['new_pass'] !== $_POST['confirm_newpass']) { 

     echo 'Your new password did not match the new confirm password or is invalid!'; 
     exit(); 

     } 

    } 

    } else { 

     $newpassword = escape_data($_POST['new_pass']); 
     $newpass_hash = password_hash($newpassword, PASSWORD_BCRYPT); 

     $sql= "UPDATE users SET " 
       . "password_hashcode='$newpass_hash', " 
       . "reset_allocated_time=NULL, " 
       . "reset_token=NULL " 
       . "WHERE user_id=".$user['user_id']." "; //<- error here 

     // Make sure user email with matching hash exist 
     $result_newpass = $heidisql->prepare($sql); 

     $result_newpass->execute(); 

     echo "Your password has been reset!"; 

     exit(); 

    } 

のようにユーザーIDを取得するにはgetメソッドを使用私は変数user_idを定義しますか?

まだ動作しません。 $ req = $ heidisql-> prepare( "SELECT * FROM users WHERE user_id = ':user_id'およびreset_token = ':reset_token'");

$req->execute([':user_id'=>$userid, ':reset_token'=>$reset_token]); 

    $sql= "UPDATE users SET password_hashcode=':password_hashcode', reset_allocated_time=NULL, reset_token=NULL WHERE user_id=:user_id"; 
    $result_newpass = $heidisql->prepare($sql); $result_newpass->execute([':user_id'=>$userid,':password_hashcode'=>$newpass_hash, ':reset_token'=>NULL, ':reset_allocated_time'=>NULL]); 

- 私が正しくURLにreset_token USER_IDを/にアクセスすることができないようだ原因私は問題がgetメソッドと嘘はあり信じますか?

... localhostの/例/ reset_pass.php?のuser_id = XX & reset_token = XXXXXXXXX

  • 私は、問題(複数可その場合

  • 誰もが知っているのuser_idで未定義の変数を取得しています)私のパスワードの検証も動作しません?

+0

したがって、ユーザーIDが必要なので、$ユーザーIDに保存されていますその変数をWHERE句で使用します。更新されたコード: 'WHERE user_id ="。$ userid' –

+0

あなたはuser_id = "のように意味します。 $ userid "というメッセージが表示されますので、もう一度やり直してください。 –

+0

二重引用符を閉じる必要はありません。最後の行を '。" WHERE user_id = "に置き換えることができます。 $ userid; ' –

答えて

0

プリペアドステートメントを使用する場合は、実際にステートメントに値を含めないでください。代わりにプレースホルダを使用し、後で値をバインドします。

変更:

$req = $heidisql->prepare(
    "SELECT * FROM users WHERE user_id='$userid' 
    AND reset_token='$reset_token' " 
); 
$req->execute($userid, $reset_token); 

へ:ダウンさらに

$req = $heidisql->prepare(
    "SELECT * FROM users WHERE user_id=:id 
    AND reset_token=:token " 
); 
$req->execute([':id'=>$userid, ':token'=>$reset_token]); 

See the docs

、あなたが持っている:

$newpassword = escape_data($_POST['new_pass']); 
$newpass_hash = password_hash($newpassword, PASSWORD_BCRYPT); 

それはおそらく(パスワードを変更するには悪い考えですエスカpe)​​してからハッシュします。ちょうどそれをハッシュ;その結果は安全に使用できます。これを変更すると、エスケープ機能が将来変更された場合に、ユーザーの実際のパスワードが認識されないというリスクが発生します。

さらに下を変更する必要があります

$sql= "UPDATE users SET password_hashcode='$newpass_hash'," 
    . "reset_allocated_time=NULL, reset_token=NULL " 
    . "WHERE user_id=".$user['user_id']." "; //<- error here 

$result_newpass = $heidisql->prepare($sql); 

$result_newpass->execute(); 

へ:

$sql= "UPDATE users SET password_hashcode=:newpass," 
    . "reset_allocated_time=NULL, reset_token=NULL " 
    . "WHERE user_id=:id"; //<- error here 

$result_newpass = $heidisql->prepare($sql); 

$result_newpass->execute([':newpass'=>$newpass_hash, ':id'=>$userid]); 
+0

私はそれがまだ動作しなかったようなSQLの両方を置く場合でも、 –

+0

@ JohnLaimuin私は編集を行いました。最後のクエリでは、 '$ user ['user_id']'の代わりに '$ userid'を使用してください。 – BeetleJuice

+0

エコーメッセージを取得していますが、まだエラーが表示されます未定義変数:userid $ result_newpass-> execute([':newpass' => $ newpass_hash、 ':user_id' => $ userid]);私のidフィールドの名前はuser_idです。 –

0

アップデートをこの$sqlここから:

$sql = "UPDATE users SET 
     password_hashcode = '$newpass_hash', 
     reset_allocated_time = NULL, 
     reset_token = NULL 
     WHERE user_id = '$user['user_id']'"; 
関連する問題